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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jaemon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值