Collectins 工具类如下提供排序方法:
- public static <T extends Comparable<? super T>> void sort(List<T> list) {
- list.sort(null);
- }
- public static <T> void sort(List<T> list, Comparator<? super T> c) {
- list.sort(c);
- }
使用方法一时对象 T 必需实现 Comparable 接口否则编译不通过, 排序时使用 Comparable 的 compareTo(T o)进行元素大小比较;
方法二需要显式指定比较器 (实现了 Comparator 接口), 排序时使用指定比较器的 compare(T o1, T o2) 方法进行元素大小比较;
自定义对象排序的例子
- public class ObjectSort {
- public static void main(String[] args) {
- List<Student> students = new ArrayList<>();
- students.add(new Student("0022", "zhangsan"));
- students.add(new Student("0001", "lisi"));
- students.add(new Student("0012", "xiaozhang"));
- students.add(new Student("0002", "xiaozhao"));
- Collections.sort(students);
- for (Student s : students) {
- System.out.println(s.getNo() + "," + s.getName());
- }
- }
- }
- class StudentComparator implements Comparator<Student> {
- @Override
- public int compare(Student o1, Student o2) {
- Integer no1 = Integer.valueOf(o1.getNo());
- Integer no2 = Integer.valueOf(o2.getNo());
- return no1 > no2 ? 1 : (no1.equals(no2)) ? 0 : -1;
- }
- }
- class Student implements Comparable<Student> {
- private String no;
- private String name;
- public String getNo() {
- return no;
- }
- public void setNo(String no) {
- this.no = no;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Student(String no, String name) {
- this.no = no;
- this.name = name;
- }
- @Override
- public int compareTo(Student o) {
- return new StudentComparator().compare(this, o);
- }
- }
根据运行结果可以发现, 默认是按照升序进行排序的而在实际应用中经常是按照倒序排序, 该如何解决呢?
调用 Collections.reverse(List<?> list)方法将升序排序结果进行倒转, 但效率不高;
修改 StudentComparator 类的 compare 方法, 代码如下:
- class StudentComparator implements Comparator<Student> {
- @Override
- public int compare(Student o1, Student o2) {
- Integer no1 = Integer.valueOf(o1.getNo());
- Integer no2 = Integer.valueOf(o2.getNo());
- // 取反
- return -(no1 > no2 ? 1 : (no1.equals(no2)) ? 0 : -1);
- }
- }
总结
1 推荐使用显式指定比较器方法, Comparable 的 compare 方法已实现或防止 compare 方法被修改的可能;
2Collectins 工具类的 sort 方法的过程是首先将 List 转换成数组, 然后选择排序方法对数组进行排序
来源: https://juejin.im/post/5aa4aec56fb9a028b54781cc