Java List排序

首先介绍常用的排序用法

Collections.sort(List list) //默认升序, 类需实现Comparable接口, 重写compareTo方法

Collections.sort(List list,Comparator<? super T> c) //传递一个比较器对象, 需重写compare方法

Comparable接口

整个Comparable.java文件只有一个方法compareTo

image-20220303183018375

基本类型的封装类

基本类型的封装类(Integer String等)都已经实现了Comparable接口并重写了compareTo方法, 所以可以直接Collections.sort(List list);, 不用传递Comparator

Integer.java文件

image-20220303184309446

自定义类

自定义类想实现比较的话, 也可以实现Comparable接口并重写了compareTo方法

Comparator 接口

Comparator 接口的方法比较多, 但我们只需关注compare方法

image-20220303185105902

传递比较器, 重写compare方法

image-20220303190657838

学会了这种方法新建list, 大概大括号里面就是对象内部了吧, 所以可以直接调方法

1
2
3
4
5
ArrayList<Integer> list = new ArrayList<Integer>() {{
add(2);
add(1);
add(5);
}};

自定义类

对于自定义类, 也可不用实现Comparable接口并重写了compareTo方法, 直接传递一个比较器, 重写compare也行


扩展–Java8新排序方法

基础类型 List 排序

1
2
list.sort(Comparator.naturalOrder()); /* naturalOrder自然排序即:正序 */
list.sort(Comparator.reverseOrder()); /* reverseOrder倒序 */

自定义类排序(list.sort()五种写法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ArrayList<TreeNode> listNodes = new ArrayList<TreeNode>() {{
add(new TreeNode(2));
add(new TreeNode(5));
add(new TreeNode(1));
}};


/* listNodes.sort(new Comparator<TreeNode>() {
@Override
public int compare(TreeNode o1, TreeNode o2) {
// return o1.val-o2.val;
return o2.val-o1.val;
}
});*/


// listNodes.sort((o1,o2)->o2.val-o1.val);


// listNodes.sort(Comparator.comparing(node -> node.val));


// listNodes.sort(Comparator.comparing(TreeNode::getVal)); // getVal为getter方法


Comparator<TreeNode> comparator =(o1,o2)->o2.val-o1.val;
listNodes.sort(comparator);
// listNodes.sort(comparator.reversed());


listNodes.forEach(node->System.out.print(node.val));

二次排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//        多条件排序第一个写法,先按Age排序,再根据Salary排序
// Comparator<Developer> comparator = (o1, o2) -> {
// if (o1.getName().equals(o2.getName())) {
// return o1.getSalary().compareTo(o2.getSalary());
// }
// return o2.getAge().compareTo(o1.getAge());
// };
// listDevs.sort(comparator.reversed());

// 多条件排序,先按Age排序,再根据Salary排序
// Comparator<Developer> ageComparator = (o1, o2)->o1.getAge().compareTo(o2.getAge());
// Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());
// listDevs.sort(ageComparator.thenComparing(salaryComparator));

// 多条件排序第二个写法,先按Age排序,再根据Salary排序
listDevs.sort(Comparator.comparing(Developer::getAge).thenComparing(Developer::getSalary));

参考

面试官:说一下List排序方法 - niceyoo - 博客园 (cnblogs.com)

Java8 让代码更优雅之List排序 - 阿刚 - OSCHINA - 中文开源技术交流社区