java中Comparatable接口和Comparator接口的区别

Wesley13
• 阅读 774

1、不同类型的排序规则

.自然排序是什么?
   自然排序是一种升序排序。对于不同的数据类型,升序规则不一样:
   BigDecimal BigInteger Byte Double Float Integer Long Short 类型,是按照数值的大小进行排序的。例如:12<23, 111.111>3.23
   Character及String类型是按照各个字符的Unicode值大小来排序的。例如:"3BC"<"AB"<"aBC"<"一二"(科大讯飞面试问到过)

2、Collections.sort()与Arrays.sort()的异同点

 不同点:它们适用对象不一样。
            Collections.sort()仅适用于列表型;
            Arrays.sort()仅适用数组类型,当然数组可以是int、float等,甚至可以是Object对象。
      共同点:它们都直接或间接地使用Comparatable接口或Comparator接口。
            Collections.sort()很明显地引用了这两个接口;
            Arrays.sort()中,其实,int、float等对应的封装类Integer、Float等class中,都有实现对接口Comparable的引用

3.Comparatable接口和Comparator接口各自的排序依据
    引言:既然是排序,那就需要指定排序依据元素,且只要指定了排序依据元素,并且调用的方法得当,那么一定可以成功排序。
    对于单元素的类,例如:int、float、double、char、String等数据类型,排序依据元素就是它相应的这个单元素。
    对于多元素的类,例如:我们自定义一个Student类,它的属性有int age;String name;等,那么我们就需要指定一个排序依据元素。
    a.Comparable接口的排序依据:
        单元素类排序:(一般是指Java中已经实现Comparable接口的类,常用的有:Integer、Float、Double、String、Character等),这些类已经有了排序依据元素,所以可以直接排序。因此,在排序中,我们可以这样做:(以int为例)
                int[] intArray = {12,34,0,5,-7,8,1,3};
                Arrays.sort(intArray); //这里就是直接依据int值的大小来排序的
                for(int i=0;i<intArray.length;i++) {
                    System.out.println(intArray[i]);
        }
        程序运行的结果是:(自然排序)-7,0,1,3,5,8,12,34
        多元素类排序:
            首先,需要进行排序的这个多元素类(如:Student)必须实现Comparable接口,且T为该多元素类的类名。
                    例如:public static Student implments Comparable
            然后,在该类中(一定要在该内的内部)实现comparaTo()方法,在这里,我们将指定排序依据元素。
                    例如:
                          @Override
                            public int compareTo(Student arg0) {
                                //这里我们指定name为排序依据元素
                                return arg0.getName().compareTo(this.name);
                            }
            最后,根据Student实例化时,是用List、还是Student[]来实现的,选择使用 Collection.sort()或Arrays.sort()进行排序。
    b.Comparator接口的排序依据:
        与Comparable不同的是,要实现Comparator接口,一定要在程序中指定排序依据元素(不管是单元素,还是多元素)。而且,这个实现Comparator接口的类一定要在排序的类(如Student)之外。可以是匿名类,如:
                           Collection.sort(allStudents,new Comparator() {
                               public int compare(Student one, Student another) {
                                   return one.getAge() - another.getAge();
                               }
                           });
        也可以是一个外部类,如class StudentSort implments{};的实例,Collention.sort(allStudent,new StudentSort());
   小结:Comparatable接口必须由需要排序的多元素类本身来实现,且在其内部重写comparaTo()方法;Comparator接口是在需要排序的多元素类的外部(即使用外部类)来实现,且必须在该外部类中重写compara()方法。

4.综合使用Comparatable和Comparator进行整体排序
   Comparable:
         优点是,对于单元素集合可以实现直接自然排序;
         缺点是,对于多元素排序,它的排序依据元素是固定的(compareTo()抽象方法只能实现一次),因此排序方式固定。
   Comparator:
         优点是,元素的排序依据元素是可变的,因为可以定义N多个外部类,每个外部类实现一种排序。在不同需求下,选择不同的排序。
         缺点是,无论是多元素,还是单元素,都必须自己创建一个外部类来实现排序。
   所以在实际运用当中,可以用Comparable的compareTo()方法来定义默认排序方式,用Comparator定义其他排序方式。
   还有一点要注意,即使Student类已经implements Comparable,但是我们在自定义外部类,如class ComparatorWithNameUP implements Comparator,并在排序时引用sort(allStudents,new ComparatorWithNameUp());生效的排序算法是ComparatorWithNameUp。

当我们要比较对象的时候:比如程序中 用到了泛型,这个时候如果比较值不能用大于等于了,对象的比较要用 compareTo,这个的接口是comparalbe里面的。

接口 Comparable<T>
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

方法详细信息:
compareTo
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
执键写春秋 执键写春秋
3年前
Java中集合排序常用的方式
1.集合排序概述1.1集合排序的主要内容:集合中的级别数据类型排序集合中的字符串排序Comparator接口Comparable接口1.2数组排序回顾intarr12,25,22,17,89,22;Arrays.sort(arr);输出:12,17,22,22,25,89Java的Arrays类中有一个sort()方法,该方法是Ar
Wesley13 Wesley13
3年前
java 数据结构(十二):Collections工具类的使用
Collections工具类1.作用:操作Collection和Map的工具类2.常用方法:reverse(List):反转List中元素的顺序shuffle(List):对List集合元素进行随机排序sort(List):根据元素的自然顺序对指定List集合元素升序排序sort(List,Comparator)
Stella981 Stella981
3年前
List自定义对象的排序,根据对象的某一列进行排序
  在工作中,经常需要对List对象集合进行排序操作,下面总结下搞个通用排序对象,原理是使用JAVA的    Comparator  接口实现排序  不多说直接上“干货”1、存在实体类:1@Data2@AllArgsConstructor3@NoArgsConstructo
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这