第1关:用匿名类实现ArrayList集合的排序
时间: 2024-03-26 21:40:19 浏览: 206
好的,我理解您的要求。以下是一个使用匿名类实现ArrayList集合排序的示例代码:
```java
List<Integer> list = new ArrayList<>();
list.add(5);
list.add(3);
list.add(9);
list.add(1);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
System.out.println(list);
```
这段代码会输出排序后的结果:[1, 3, 5, 9]。
在这个示例中,我们使用了`Collections.sort()`方法来对ArrayList进行排序,同时我们创建了一个匿名类实现了`Comparator`接口,这个接口定义了用于比较两个对象的方法`compare()`。在这里,我们使用了`o1.compareTo(o2)`来比较两个整数的大小。
相关问题
程题:编写一个java程序(注:所有代码写在一个文件里),要求如下: 有如下数字字符串: String str="12 34 32 22 32 33 53 42 4 34 33 22 11 23 43 3";数字字符之间用空格分割。 (1) 使用Scanner类将str中的数字转换并生成到集合ArrayList中; (2) 采用匿名类实现排序(从大到小),并输出。 提示: 比较的泛型接口为:Comparator<Integer> 实现的接口方法为:public int compare(Integer o1, Integer o2);
下面是实现上述要求的Java程序:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String str = "12 34 32 22 32 33 53 42 4 34 33 22 11 23 43 3";
Scanner scanner = new Scanner(str);
ArrayList<Integer> list = new ArrayList<Integer>();
while (scanner.hasNextInt()) {
list.add(scanner.nextInt());
}
scanner.close();
Collections.sort(list, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
System.out.println(list);
}
}
```
程序的思路如下:
首先,定义一个字符串 `str`,其中包含了一些数字,数字之间用空格分割。
然后,创建一个 `Scanner` 对象,将字符串 `str` 转换成数字并存储到 `ArrayList` 中。
接下来,使用 `Collections.sort()` 方法对 `ArrayList` 进行排序,排序规则是按照从大到小的顺序。
最后,输出排序后的结果。
这里需要注意的是,我们使用了匿名类来实现 `Comparator` 接口中的 `compare()` 方法。在 `compare()` 方法中,我们只需要比较两个整数的大小关系,并返回一个整数值即可。如果返回值小于0,则表示第一个整数小于第二个整数;如果返回值等于0,则表示两个整数相等;如果返回值大于0,则表示第一个整数大于第二个整数。根据这个返回值,`sort()` 方法就可以实现排序了。
1)思考如何对ArrayList定义的Account集合排序,按照账户的余额由小到大排列?请描述实现思想或关键语句。 2)归纳单例模式的设计原理,思考为什么属性和方法为static ?构造函数为private?
1)在Java中,要对`ArrayList<Account>`类型的集合按账户余额由小到大排序,你可以使用Collections.sort()方法配合自定义的Comparator。首先,你需要在Account类上添加Comparable接口并覆盖compareTo()方法,以便比较余额。然后,创建一个匿名内部类Comparator,定义其compare()方法,将两个Account实例的balance字段作为比较依据。关键步骤如下:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class Account implements Comparable<Account> {
private double balance;
// ... 其他属性和方法
@Override
public int compareTo(Account other) {
return Double.compare(this.balance, other.balance);
}
}
public class Main {
public static void main(String[] args) {
ArrayList<Account> accounts = ...; // 填充账户列表
Collections.sort(accounts); // 使用默认的自然顺序排序,因为Account实现了Comparable
}
}
```
2)单例模式的设计原理主要是为了保证系统只有一个该类的实例,并提供一个全局访问点。以下是设计要点:
- **静态变量和方法**:将实例作为类的静态成员,确保在整个应用程序生命周期内只存在一个实例。通过私有化构造函数,防止外部直接创建新的实例。
- **延迟加载**:通常使用懒汉式或饿汉式初始化策略,只有当第一次需要时才创建实例,减少资源消耗。
- **双重检查锁定**(Optional):在多线程环境中,通过双重检查锁定(dCL)优化单例的同步机制,避免了不必要的锁竞争。
单例模式的属性和方法设置为static的主要原因是它们不需要依赖于对象状态,而是属于整个类的行为,适用于全局共享的状态或操作。而构造函数设为private是为了强制使用工厂方法或静态方法获取唯一实例,确保控制权集中在单例模式自身。
阅读全文