Comparable & Comparator
- Comparable 是排序接口: 若一个类实现了 Comparable 接口, 就意味着“该类支持排序”,相当于“内部比较器”
- Comparator 是比较器接口: 我们若需要控制某个类的次序, 而
该类本身不支持排序
(即没有实现 Comparable 接口), 可以建立一个“该类的比较器”来进行排序, 相当于“外部比较器”
我们不难发现: Comparable 相当于“内部比较器”, 而 Comparator 相当于“外部比较器”
通过 x.compareTo(y) 来 比较x和y的大小
- 返回
-1
: 意味着 x < y - 返回
0
: 意味着 x == y - 返回
1
: 意味着 x > y
实体类
@Data
@AllArgsConstructor
public class Person implements Comparable<Person> {
private String name;
private Integer age;
@Override
public int compareTo(Person p) {
return this.name.compareTo(p.name);
}
}
程序验证
public class AnswerApp {
private static final ScriptEngine SCRIPTENGINEMANAGER = new ScriptEngineManager().getEngineByName("nashorn");
public static void main(String[] args) {
System.out.println("按照名称升序排序...");
List<Person> persons = generator();
// 若 Person 类没有实现 Comparable 接口, 则此处编译不通过
Collections.sort(persons);
System.out.println(persons);
System.out.println();
System.out.println("按照年龄升序排序...");
persons = generator();
// 若 Person 类没有实现 Comparable 接口, 可以通过定义一个比较器来进行排序
// 升序比较器 ·persons.sort((p1, p2) -> p1.getAge() - p2.getAge());·
persons.sort(Comparator.comparingInt(Person::getAge));
System.out.println(persons);
System.out.println();
System.out.println("按照年龄降序排序...");
persons = generator();
// 降序比较器
persons.sort((p1, p2) -> p2.getAge() - p1.getAge());
System.out.println(persons);
System.out.println();
}
private static List<Person> generator() {
List<Person> persons = Lists.newArrayList();
for (int i = 0; i < 5; i++) {
persons.add(new Person("answer" + i, new Random().nextInt(100)));
}
System.out.println(persons);
return persons;
}
}
程序运行结果
按照名称升序排序...
[Person(name=answer0, age=6), Person(name=answer1, age=34), Person(name=answer2, age=85), Person(name=answer3, age=4), Person(name=answer4, age=53)]
[Person(name=answer0, age=6), Person(name=answer1, age=34), Person(name=answer2, age=85), Person(name=answer3, age=4), Person(name=answer4, age=53)]
按照年龄升序排序...
[Person(name=answer0, age=98), Person(name=answer1, age=79), Person(name=answer2, age=56), Person(name=answer3, age=83), Person(name=answer4, age=81)]
[Person(name=answer2, age=56), Person(name=answer1, age=79), Person(name=answer4, age=81), Person(name=answer3, age=83), Person(name=answer0, age=98)]
按照年龄降序排序...
[Person(name=answer0, age=83), Person(name=answer1, age=47), Person(name=answer2, age=15), Person(name=answer3, age=43), Person(name=answer4, age=58)]
[Person(name=answer0, age=83), Person(name=answer4, age=58), Person(name=answer1, age=47), Person(name=answer3, age=43), Person(name=answer2, age=15)]