• 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相当于“外部比较器”

  • 相关阅读:
    每日一练 | 华为认证真题练习Day132
    微信小程序 uCharts的使用方法
    微信如何实现自动转发朋友圈(跟圈)?
    HTM5网页设计作业成品 HTML+CSS校园安全公益网站制作
    嵌入式Linux驱动开发(LCD屏幕专题)(一)
    普适型GNSS接收机_一体化GNSS测量仪
    烟花爆竹厂如何做到0风险0爆炸事故?AI+视频监控平台给出答案
    Linux 修改SSH的显示样式,修改终端shell显示的样式,美观更改
    Part2_扩展MATSIM_Subpart4_除个人车外的其他模式_第23章 动态运输服务
    面向对象实验五虚函数
  • 原文地址:https://blog.csdn.net/qq_51222096/article/details/126558622