0
点赞
收藏
分享

微信扫一扫

Java 中 Comparable 和 Comparator 比较


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)]

 

Reference

  • ​​Java 中 Comparable 和 Comparator 比较​​


举报

相关推荐

0 条评论