一、排序规则
Comparable和Comparator都是函数式接口,两者的使用大同小异。
比较规则:
1、Comparable下有个comparaTo(T o)方法,调用 a.comparaTo(b),如果是正数,则a比b大;如果是负数,则a比b小;如果是0,则相等。
2、Comparator下有个compara(T o1,To2)方法,调用compara(T o1,To2),如果是正数,则a比b大;如果是负数,则a比b小;如果是0,则相等。
同时,按照该排序逻辑,返回的数据默认有小到大排列。
使用方式:
1、Comparable被实体类继承,然后重写comparaTo方法。实体类实现Comparable,重写comparaTo方法。就可以被一些集合方法调用,实现排序。如TreeSet和TreeMap的自动排序(其实,前者调用后者)和Collections.sort()和Arrays.sort()。
1、Comparator一般被当做参数传递给集合类,如List的sort方法。
二、实现方式
1、Comparable的排序
实体类:
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Student implements Comparable<Student>{ private String name; private Integer age; public int compareTo(Student o) { //先按name排序 if(this.name.compareTo(o.getName())>0) return 1; if(this.name.compareTo(o.getName())<0) return -1; //再按age排序 if(this.age > o.age) return 1; if(this.age < o.getAge()) return -1; return 0; } }
测试代码:
import org.junit.Test; import java.util.*; public class AppTest { @Test public void test(){ ArrayList<Student> list = new ArrayList(); list.add(new Student("tom",22)); list.add(new Student("tom",24)); list.add(new Student("tom",2)); System.out.println(list); Collections.sort(list); System.out.println(list); } }
结果:
[Student(name=tom, age=22), Student(name=tom, age=24), Student(name=tom, age=2)]
[Student(name=tom, age=2), Student(name=tom, age=22), Student(name=tom, age=24)]
2、Comparator的排序
实体类:
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Student{ private String name; private Integer age; }
测试代码:
import org.junit.Test; import java.util.*; public class AppTest { @Test public void test(){ ArrayList<Student> list = new ArrayList(); list.add(new Student("tom",22)); list.add(new Student("tom",24)); list.add(new Student("tom",2)); System.out.println(list); list.sort((c1,c2) -> c1.getAge()-c2.getAge());//lambda表达式 System.out.println(list); } }
结果:
[Student(name=tom, age=22), Student(name=tom, age=24), Student(name=tom, age=2)]
[Student(name=tom, age=2), Student(name=tom, age=22), Student(name=tom, age=24)]
注意:两个比较对象的顺序写错会直接导致排序方式变化,由正序变成反序。