实现
- Comparable实现比较器
Comparable实现比较器,是定义在Person类的内部的,因此实体类Person需要实现实现Comparable<T>接口,然后覆写compareTo方法。
package leif;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
public class Test {
public static void main(String[] args) {
Person person0 = new Person("aaa", 16);
Person person1 = new Person("bbb", 20);
Person person2 = new Person("aaa", 18);
Person person3 = new Person("bbb", 14);
Person person4 = new Person("ccc", 14);
Person person5 = new Person("ccc", 15);
Person person6 = new Person("ddd", 13);
Person person7 = new Person("bbb", 15);
Person person8 = new Person("ddd", 16);
Person person9 = new Person("bbb", 14);
List<Person> personList = Stream.of(person0, person1, person2, person3, person4, person5, person6, person7, person8, person9).collect(Collectors.toList());
Collections.sort(personList);
personList.forEach(System.out::println);
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Person implements Comparable<Person> {
private String name;
private int age;
// 先比较年龄,若年龄相等则比较名字,升序排列
@Override
public int compareTo(Person another) {
int i = age - another.getAge();
if (i == 0) {
return name.compareTo(another.getName());
} else {
return i;
}
}
}
- Comparator实现比较器
Comparator实现比较器,是定义在Person类的外部的,因此实体类Person不需要做任何变化,只需要自定义类实现Comparator<T>接口并覆写compare方法。
package leif;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
public class Test {
public static void main(String[] args) {
Person person0 = new Person("aaa", 16);
Person person1 = new Person("bbb", 20);
Person person2 = new Person("aaa", 18);
Person person3 = new Person("bbb", 14);
Person person4 = new Person("ccc", 14);
Person person5 = new Person("ccc", 15);
Person person6 = new Person("ddd", 13);
Person person7 = new Person("bbb", 15);
Person person8 = new Person("ddd", 16);
Person person9 = new Person("bbb", 14);
List<Person> personList = Stream.of(person0, person1, person2, person3, person4, person5, person6, person7, person8, person9).collect(Collectors.toList());
personList.sort((p1, p2) -> {
int i = person1.getAge() - person2.getAge();
if (i == 0) {
return person1.getName().compareTo(person2.getName());
} else {
return i;
}
});
personList.forEach(System.out::println);
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Person {
private String name;
private int age;
}
结果

image.png
总结
- Comparable与Comparator都是Java的接口,用来对自定义的实体对象进行比较,都需要覆写方法。
- Comparable定义在实体类内部,需要覆写compareTo方法,所以实体类对象本身就有比较大小的可能。但如果想换一种比较规则,那么就必须修改实体类本身。
- Comparator定义在实体类外部,需要覆写compare方法,所以排序时必须同时传入数据和比较器。如果想换一种比较规则,则仅需要修改比较器,实体类则不需要任何改变。