比较器分为java.util.Comparator、java.lang.Comparable
区别
Comparable:属于内部比较器,不可以传null
Comparator:属于外部比较器,可以传null
Comparator
-
对整数列表排序(升序)
List<Integer> list = Arrays.asList(1, 4, 2, 6, 2, 8); // Comparator.naturalOrder()使用其的前提是对象需实现Comparable接口,会调用其compare list.sort(Comparator.naturalOrder()); System.out.println(list);
-
对整数列表排序(降序)
List<Integer> list = Arrays.asList(1, 4, 2, 6, 2, 8); list.sort(Comparator.reverseOrder()); System.out.println(list);
public class Person {
private Integer age;
private Integer height;
private String name;
}
List<Person> personList = new ArrayList<>();
personList.add(new Person(18, 170, "b"));
personList.add(new Person(20, 175, "a"));
personList.add(new Person(19, 172, "c"));
// 按照年龄升序排列
personList.sort(Comparator.comparing(Person::getAge));
personList.sort(Comparator.comparingInt(Person::getAge));
// 按照年龄降序排列
personList.sort(Comparator.comparing(Person::getAge).reversed());
personList.sort(Comparator.comparingInt(Person::getAge).reversed());
personList.sort(Comparator.comparing(Person::getAge,
Comparator.reverseOrder()));
// 先按年龄升序,在按身高升序
personList.sort(Comparator.comparingInt(Person::getAge)
.thenComparing(Person::getHeight));
// 先按年龄降序,在按身高升序
personList.sort(Comparator.comparingInt(Person::getAge).reversed()
.thenComparing(Person::getHeight));
personList.sort(Comparator.comparing(Person::getAge, Comparator.reverseOrder()).thenComparing(Person::getHeight));
// 先按年龄降序,在按身高降序
personList.sort(Comparator.comparingInt(Person::getAge).thenComparing(Person::getHeight).reversed());
// 先按年龄升序,在按身高降序
personList.sort(Comparator.comparingInt(Person::getAge).reversed().thenComparing(Person::getHeight).reversed());
personList.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getHeight, Comparator.reverseOrder()));
List<String> list = Arrays.asList("nihao", "hello", "world", "welcome");
// 按照字母升序排序
list.sort(String::compareTo);
// Collections.sort(list);
// 按照字符串的长度升序排序
list.sort(Comparator.comparing(String::length));
list.sort((item1, item2) -> item1.length() - item2.length());
自定义排序规则
int compare(T o1, T o2);
// 规则定义:升序为正,降序为负 o1-o2为正 > 为正
o1-o2>0 正正=正 升序排列;
o1-o2<0 正负=负 降序排列;
o2-o1>0 负正=负 降序排列;
o2-o1<0 负负=正 升序排列;