Java Collections.sort()排序方法详解

培训教学 潘老师 7个月前 (10-07) 278 ℃ (0) 扫码查看

学习如何使用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进行排序。我们还学习了如何使用比较器来实现自定义排序逻辑。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9345.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】