• Comparable是排序接口 Comparator是比较器接口


    目录

    Comparable排序接口

    Comparator是比较器接口

    Comparator比较接口的定义

    Comparator和Comparable比较


    Comparable排序接口

    若一个类实现了Comparable接口,就意味着该类支持排序。即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序

    1. public interface Comparable {
    2. public int compareTo(T o);
    3. }

    假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”

    1. 定义一个可比较的类 --- 是为了排序 ---排序规则
    2. public class Pig implements Comparable {
    3. private Long id;
    4. private double weight;
    5. public int compareTo(Pig obj){
    6. double res=this.weight-obj.weight;
    7. if(res>1e-6) return 1;
    8. else if(res<-1e-6) return -1;
    9. return 0;
    10. }
    11. }
    12. List list=new ArrayList<>();
    13. Random r=new Random();
    14. for(int i=0;i<10;i++){
    15. Pig temp=new Pig(1L+i, r.nextDouble()*500);
    16. list.add(temp);
    17. }
    18. Collections.sort(lit);
    19. for(int i=0;i

    Collections是集合中所使用的一个工具类,其中提供了一些常见的集合操作方法,例如排序

    Comparator是比较器接口

    我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么可以
    建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说
    可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

    如果Pig类并没有实现Comparable接口,调用Collections.sort(list);则代码报错 

    1. 这是因为在Collections工具类中方法的定义为
    2. public static extends Comparablesuper T>> void sort(List list){
    3. list.sort(null);
    4. }

    T extends Comparable不是说T必须继承于Comparable接口,而是表示T类型必须实现了
    Comparable接口。这里报错就是因为Pig类定义和Comparable接口无关

     按照开闭原则不修改源代码,则可以额外引入比较器

    1. public static void sort(List list, Comparatorsuper T> c){
    2. list.sort(c);
    3. }

    Comparator比较接口的定义

    1. @FunctionalInterface 函数式接口,所以可以使用lambda表达式
    2. public interface Comparator {
    3. int compare(T o1, T o2);
    4. boolean equals(Object obj);
    5. default Comparator reversed() {
    6. return Collections.reverseOrder(this);
    7. }
    8. }

    这里将compare和equals声明在一起,是提醒开发者注意两者之间的相关性

    1. List list=new ArrayList<>();
    2. Random r=new Random();
    3. for(int i=0;i<10;i++){
    4. Pig temp=new Pig(1L+i, 500*r.nextDouble());
    5. list.add(temp);
    6. }
    7. //使用lambda表达式定义
    8. Comparator c=(obj1,obj2)->{ 泛型声明影响obj1和obj2为Pig类型
    9. double res=obj1.getWeight()-obj2.getWeight(); //直接调用Pig类中的方法
    10. if(res>1e-6) return 1;
    11. else if(res<-1e-6) return -1;
    12. else return 0;
    13. };
    14. Collections.sort(list, c.reversed());
    15. list.forEach(System.out::println);

    注意:在不同Eclipse版本中编写Lambda表达式可能会有报错,但是不一定是程序问题

    Comparator和Comparable比较

    Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

    Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”

  • 相关阅读:
    stm32入门学习13-时钟RTC
    Jeston ros1 环境下 编译RealSense SDK
    基于JAVA人脸识别公司签到系统(Springboot框架+AI人工智能) 开题报告
    机械臂<四大家族>你知道多少
    xss-labs/level7
    java使用mapper操作mysql
    【重拾C语言】十二、C语言程序开发(自顶向下、逐步求精;结构化程序设计原则;程序风格)
    数据结构:排序解析
    美团面试:Redis 除了缓存还能做什么?可以做消息队列吗?
    20221119 今天的世界发生了什么
  • 原文地址:https://blog.csdn.net/qq_51222096/article/details/126558622