文
章
目
录
章
目
录
学习如何使用Collections.sort()方法对对象列表进行排序,下面是一些示例。
默认情况下,sort()方法按升序(或自然顺序)对给定的列表进行排序。我们可以使用Collections.reverseOrder()方法,该方法返回一个比较器,用于进行逆序排序。
1.自然顺序和逆序排序
Collections.sort(list); //自然排序
Collections.sort(list, Collections.reverseOrder()); //逆排序
上述方法将指定的项目列表按其自然顺序排序。
- 所有项目必须实现Comparable接口。
- 所有项目必须可相互比较,不应抛出ClassCastException异常。
- 此排序保证是稳定的,这意味着等于的元素不会因排序而重新排序。
- 指定的列表必须是可修改的,但不必是可调整大小的。
- sort()方法不返回任何值。
1.1. 对字符串ArrayList进行排序
Java程序按词典顺序对字符串列表进行排序。
List<String> names =
Arrays.asList("Alex", "Charles", "Brian", "David");
//输出 - [Alex, Brian, Charles, David]
Collections.sort(names);
//输出 - [David, Charles, Brian, Alex]
Collections.sort(names, Collections.reverseOrder());
1.2. 按字段对对象的ArrayList进行排序
我们可能需要对具有自己的排序逻辑的自定义对象列表进行排序。在这种情况下,在自定义类中实现Comparator接口。
例如,域对象Employee在名称字段上具有默认排序。在compareTo()方法中查看比较逻辑。
public class Employee implements Comparable<Employee>{
private Integer id;
private String name;
private String email;
private LocalDate dateOfBirth;
//Getters and Setters
@Override
public int compareTo(Employee e) {
return this.getName().compareTo(e.getName());
}
}
以下Java程序按名称对Employee对象列表进行排序。
ArrayList<Employee> employees = methodReturnsUnsortedList();
//自然排序
Collections.sort(employees);
//逆排序
Collections.sort(employees, Collections.reverseOrder());
2.使用比较器进行自定义排序
sort()方法中的第二个参数接受一个Comparator的实例。
我们可以使用比较器的帮助来实现任何类型的比较逻辑,然后我们可以使用sort()方法基于给定的自定义逻辑对列表进行排序。
Collections.sort(List, Comparator);
我们可以为每种排序需求创建单独的Comparator实例,然后将这些实例组合在一起以创建分组排序效果。
例如,如果我们想要对Employee列表按照三个字段排序 – id、name和age。在这种情况下,我们需要创建3个Comparator实例。
2.1. 创建自定义比较器
这是在Java中创建比较器的一般语法。在这种情况下,我们正在创建一个按id字段对Employee列表进行排序的比较器。
Comparator<Employee> compareById = new Comparator<Employee>() {
@Override
public int compare(Employee o1, Employee o2) {
return o1.getId().compareTo(o2.getId());
}
};
Comparator<Employee> compareByName = new Comparator<Employee>() {
@Override
public int compare(Employee o1, Employee o2) {
return o1.getName().compareTo(o2.getName());
}
};
我们可以使用lambda表达式来进一步缩短语法。
//Id 比较器
Comparator<Employee> compareById = (Employee o1, Employee o2) ->
o1.getId().compareTo( o2.getId() );
//Name 比较器
Comparator<Employee> compareByName = (Employee o1, Employee o2) ->
o1.getName().compareTo( o2.getName() );
2.2. 使用比较器进行排序
ArrayList<Employee> employees = getUnsortedEmployeeList();
Comparator<Employee> compareById =
(Employee o1, Employee o2) -> o1.getId().compareTo( o2.getId() );
Collections.sort(employees, compareById);
Collections.sort(employees, compareById.reversed());
3.结论
在上面的代码示例中,我们学习了如何按默认顺序或逆序对ArrayList进行排序。我们还学习了如何使用比较器来实现自定义排序逻辑。