Comparable/Comparable

本文介绍了Java中Comparator和Comparable的区别。Comparable是内部比较器,用于对象自身排序,不能传null;Comparator是外部比较器,可用于任意对象排序,能传null。示例展示了如何对整数列表、Person对象列表以及字符串列表进行升序和降序排序。此外,还讲解了自定义排序规则和多种排序组合。
摘要由CSDN通过智能技术生成

比较器分为java.util.Comparatorjava.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 负负=正 升序排列;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

①笶侕濄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值