ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java学习笔记——Comparator和Comparable

2021-04-12 15:58:55  阅读:152  来源: 互联网

标签:Comparable java val Comparator 接口 排序 public


目录

Comparable

  • Comparable排序接口
  • 如果一个类实现了Comparable接口,就说明该类支持排序。此外,实现Comparable接口的类的对象可以用作有序映射(如TreeMap)中的键或有序集合中的元素,而不需要指定比较器。
  • Comparable接口所定义的顺序,叫做natural ordering。当向支持排序的集合中添加该类元素后,在对该集合排序时,就会调用comparaTo方法来进行natural ordering进行排序。
  • 接口中通过x.comparaTo(y)来比较x和y的大小。若返回负数,说明x<y;返回正数,说明x>y;返回0,说明x=y。
  • 列如在赫夫曼树的建立中,就需要对树的节点类实现Comparable接口
//由于赫夫曼树需要对数的根节点排序,因此需要实现comparable接口,就能直接使用Collection.sort方法了
public class Node implements Comparable<Node>{
    public int val;
    public Node left;
    public Node right;

    public Node(int val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "Node{" +
                "val=" + val +
                '}';
    }

    @Override
    public int compareTo(Node o) {
        return this.val - o.val;    //this-o为从小到大排序,反过来为从大到小
    }
}

Comparator

  • Comparator比较器接口
  • 该接口的作用是用来辅助排序的。在上文中,我们说了Comparable接口指定了对象的natural ordering,但是如果我们想在排序时按照我们自定义的方式进行排序,这个时候就需要用到Comparator接口了。
  • Collections.sort(List,Comparator)Arrays.sort(Object[],Comparator)等这些辅助的方法类都可以通过传入一个Comparator来自定义排序规则。在排序过程中,首先会去检查Comparator是否存在,如果不存在则会使用默认的natural ordering
  • int compare(T o1, T o2)和上面的x.comparaTo(y)类似,定义排序规则后,返回正数、负数和0,分别代表大于、小于和等于。
  • 比如,对一个Integer类型的数组的排序方式进行重写,使其在sort后按降序排列
public class Test {
    public static void main(String[] args) {
        Integer[] a = {3,2,7,4,0,6,5};

        Arrays.sort(a);
        System.out.print("重写前:");
        System.out.println(Arrays.toString(a));

        Arrays.sort(a, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.print("重写后:");
        System.out.println(Arrays.toString(a));
    }
}
重写前:[0, 2, 3, 4, 5, 6, 7]
重写后:[7, 6, 5, 4, 3, 2, 0]

注意

  • Comparator允许对null参数的比较,而Comparable是不允许的,否则会爬出NullPointerException
  • Comparator不支持对intdouble等基本数据类型的排序方法进行重写

标签:Comparable,java,val,Comparator,接口,排序,public
来源: https://blog.csdn.net/qq_36334929/article/details/115623998

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有