首页 > 试题广场 >

Comparable和Comparator接口是干什么的?列

[问答题]
Comparable和Comparator接口是干什么的?列出它们的区别。
Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。 Comparator位于包java.util下,而Comparable位于包 java.lang下 Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口) 自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序, 这里的自然顺序就是实现Comparable接口设定的排序方式。 而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。 可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。 用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。 比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。
发表于 2016-03-10 11:45:32 回复(3)
comparable接口和comparator接口都是用来实现集合元素的比较和排序的。两者的区别就在于两者的实现方法不同。对于排序的依据元素,分为两种情况:
  • 对于单元素的类:int,float,double,char,String等数据类型,排序依据就是它相应的这个单元素。
  • 对于多元素的类:例如,我们定义一个Student类,它的属性有int类型的age和String类型的name等,这时候就需要我们自己指定一个排序依据元素。
    下面通过代码来体现两者在多元素的类的时候的不同。





    先来看实现comparable接口的排序。

    //在内部实现comparable接口,指定排序依据 public class Student implements Comparable<Student> { private int age; private String name; public int getAge() { return age;
            } public void setAge(int age) { this.age = age;
            } public String getName() { return name;
            } public void setName(String name) { this.name = name;
            } public Student(int age, String name) { super(); this.age = age; this.name = name;
            } /* (non Javadoc) 
             * @Title: compareTo
             * @Description: 实现comparaTor()方法,来指定排序依据
             * @param stu
             * @return 
             * @see java.lang.Comparable#compareTo(java.lang.Object) 
             */ @Override public int compareTo(Student stu) { return this.getName().compareTo(stu.getName());//定义成升序 } @Override public String toString() { return age + "\t" + name + "\n";
    
            }
    
        }
    //测试如下 public class ComparatableTest { public static void main(String[] args) { //定义一个学生数据库 Student[] allStudents = new Student[4]; //初始化学生数据库 allStudents[0] = new Student(1,"a");
            allStudents[1] = new Student(2,"b");
            allStudents[2] = new Student(3,"c");
            allStudents[3] = new Student(4,"d"); for(int i=0;i<allStudents.length;i++){
            allStudents[i].setAge(i*10);
            } //不同点 Arrays.sort(allStudents);//通过student内部的compareTo()方法比较排序。 //显示学生信息 System.out.println("年龄" + "\t姓名"); for(int i=0;i<allStudents.length;i++){
            System.out.print(allStudents[i]);
            }
    
    
        }

    再来看看实现comparator接口的排序。

    //这里并未实现comparable接口 public class Student2 { private int age; private String name; public int getAge() { return age;
        } public void setAge(int age) { this.age = age;
        } public String getName() { return name;
        } public void setName(String name) { this.name = name;
        } public Student2(int age, String name) { super(); this.age = age; this.name = name;
        } @Override public String toString() { return age + "\t" + name + "\n";
    
        }
    
    }
    //在外部实现comparator接口,构建自己的排序实现类,指定排序依据 public class StudentSortWithName implements Comparator<Student2> { /* (non Javadoc) 
         * @Title: compare
         * @Description: 实现Comparator的compare()方法,定义name为排序依据
         * @param o1
         * @param o2
         * @return 
         * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) 
         */ @Override public int compare(Student2 o1, Student2 o2) { return o1.getName().compareTo(o2.getName());
        }
    
    }
    //在外部实现comparator接口,构建自己的排序实现类,指定排序依据 public class StudentSortWithAge implements Comparator<Student2> { /* (non Javadoc) 
         * @Title: compare
         * @Description: 实现Comparator的compare()方法,定义age为排序依据,
         * @param o1
         * @param o2
         * @return * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) 
         */ @Override public int compare(Student2 o1, Student2 o2) { if(o1.getAge() > o2.getAge()){ return 1;
            }else if(o1.getAge() < o2.getAge()){ return -1;
            }else{ return 0;
            }
        }
    
    }
    //测试comparator public class ComparatorTest { public static void main(String[] args) { //定义一个学生数据库 Student2[] allStudents = new Student2[4]; //初始化学生数据库 allStudents[0] = new Student2(1,"a");
            allStudents[1] = new Student2(2,"b");
            allStudents[2] = new Student2(3,"c");
            allStudents[3] = new Student2(4,"d"); for(int i=0;i<allStudents.length;i++){
            allStudents[i].setAge(i*10);
            } //显示学生信息 System.out.println("年龄" + "\t姓名"); for(int i=0;i<allStudents.length;i++){
            System.out.print(allStudents[i]);
            }
    
            Arrays.sort(allStudents,new StudentSortWithName());//不同点, //通过 <T> void java.util.Arrays.sort(T[] a, Comparator<? super T> c)来调用自己构建的排序实现类 //显示学生信息 System.out.println("年龄" + "\t姓名"); for(int i=0;i<allStudents.length;i++){
            System.out.print(allStudents[i]);
            }
    
    
        }
    
    }

    小结:Comparatable接口必须由需要排序的多元素类本身来实现,且在其内部重写comparaTo()方法;Comparator接口是在需要排序的多元素类的外部(即使用外部类)来实现,且必须在该外部类中重写compara()方法。

    两者的比较

      comparable接口:
    • 优点:对于单元素集合可以实现直接排序
    • 缺点:对于多元素排序,排序依据是固定不可更改的。(元素内部只能实现一次compareTo方法)
      comparator接口:
    • 元素的排序依据时刻变的,所以可以通过定义多个外部类的方式来实现不同的排序。使用时按照需求选取。
    • 创建外部类的代价太大。
  • 发表于 2016-09-01 11:28:50 回复(2)
    二者均是对集合进行比较和排序的接口。不同点是:
    comparable接口是在内部类通过重写compareTo方法实现的,而comparator接口则是在外部类通过重写compare与equal方法实现的。
    comparable接口实现较简单,但对于多元素排序不方便,因为在重写compareTo方法时事先定义好了元素比较顺序;comparator接口实现较复杂,可能定义多个外部类,但对于多元素使用起来很方便。
    发表于 2017-08-31 11:14:31 回复(0)
    一群sb,粘贴复制的狗,自己不会不要影响评论区,让别人怎么看
    发表于 2016-04-02 10:11:47 回复(4)

    说到比较器我们第一时间会想到equals,但是equals是用来比较是否相等的,Comparator或者Comparable是用来比较顺序的(也就是排序)。

    比较器的概念

    确定两个对象之间的大小关系及排列顺序称为比较,能实现这个比较功能的类或方法称之为比较器,在java中只有两种比较器。

    比较器的分类

    内部比较器(Comparable接口)和外部比较器(Comparator接口)。

    内部比较器(简单点说就是把比较器写在类的内部)的概念

    类实现了Comparable接口,然后重写了compareTo方法(这个方法可以看作比较器),这个类就拥有了内部比较器。注意,你一旦实现了比较器,就说明这个类支持排序,比如单例模式的类就不能进行排序。

    下面看看Comparable接口的源码(了解下就行)

    package java.lang;

    public interface Comparable

    {

    public int compareTo(T o);

    1)如果此对象(调用比较器方法的对象)大于指定对象(目标比较对象),返回正整数

    2)如果此对象小于指定对象,返回负整数

    3)如果此对象等于指定对象,返回零

    }

    外部比较器(简单点说就是把比较器写在类的外边,没错!就是在外边新定义了个比较器类!)的概念

    新定义一个类,类名随意,但这个类必须实现Comparator接口,重写compare方法,我们把这个称作外部比较器。

    下面看看Comparable接口的源码(了解下就行)

    package java.util;

    public interface Comparator {

    int compare(T o1, T o2);

    1)如果o1大于o2,则返回正整数;
    2)如果o1小于o2,则返回负整数
    3)如果o1等于o2,则返回零

    boolean equals(Object obj); //你是不是想问为什么这个方法不需要重写?对不起,我也不是特别清楚,但通常是把这个方法忽略掉,如果

    必须要个说法,你可以说这个方法被默认实现了。

    }

    现在我们有两种比较器的实现方法,用的时候用哪种呢?

    1.我们自定义一个类时,可以选择内部比较器,内部比较器很符合java封装的思想,也就是高内聚,但是!但是!但是!我们平时用到的类往往不是自定义的,而是别人已经写好并且已编译的类,我们只能调用,不能修改其源代码,这时我们就只能用外部比较器了。

    2.还有种情况,我们用到的还是别人已经写好并且已编译的类,他写这个类的时候恰好也实现了内部比较器(我们常用的有基本类型的封装类,String,Date),但是他定义的这种比较方法,不是我们想要的(举个例子,integer的内部比较器是按照数字大小进行比较排序,但是我们的需求是按照数字的绝对值进行排序,这就很尴尬了),这时我们就只能用外部比较器了。

    3.第三种情况,我们平时对对象进行排序,往往需要多种排序方式(举个例子,学生表的排序方式有学号排序,年龄排序,性别排序等等),这时我们也不得不用外部比较器了(也就是定义多个外部比较器类)。

    由此看出,外部比较器比内部比较器更灵活,更易维护。

    比较器的应用

    最最常见的应用还是用在集合(list)和数组的sort()方法中,如果我们想用sort()方法,必须实现存储元素对象的内部比较器或者自定义一个用于存储元素对象之间的外部比较器,不然用sort()方法的时候容器会报错,它不知道用哪种方式进行排序。

    下面贴个比较器和sort方法的应用Demo,自己体会一哈:

    1. /**
      • 员工实体
      • @author Sam
    2. *
    3. */
    4. public class Employee implements Comparable {
    5. private int id;// 员工编号
    6. private double salary;// 员工薪资
    7. public int getId() {
    8. return id;
    9. }
    10. public void setId(int id) {
    11. this.id = id;
    12. }
    13. public double getSalary() {
    14. return salary;
    15. }
    16. public void setSalary(double salary) {
    17. this.salary = salary;
    18. }
    19. public Employee(int id, double salary) {
    20. super();
    21. this.id = id;
    22. this.salary = salary;
    23. }
    24. // 为了输出方便,重写toString方法
    25. @Override
    26. public String toString() {
    27. // 简单输出信息
    28. return "id:"+ id + ",salary=" + salary;
    29. }
    30. // 比较此对象与指定对象的顺序
    31. @Override
    32. public int compareTo(Employee o) {
    33. // 比较员工编号,如果此对象的编号大于、等于、小于指定对象,则返回1、0、-1
    34. int result = this.id > o.id ? 1 : (this.id == o.id ? 0 : -1);
    35. // 如果编号相等,则比较薪资
    36. if (result == 0) {
    37. // 比较员工薪资,如果此对象的薪资大于、等于、小于指定对象,则返回1、0、-1
    38. result = this.salary > o.salary ? 1 : (this.salary == o.salary ? 0 : -1);
    39. }
    40. return result;
    41. }
    42. }

    43. /**

      • 测试两种比较器
      • @author Sam
    44. *
    45. */
    46. public class TestEmployeeCompare {
    47. /**
      • @param args
    48. */
    49. public static void main(String[] args) {
    50. List employees = new ArrayList();
    51. employees.add(new Employee(2, 5000));
    52. employees.add(new Employee(1, 4500));
    53. employees.add(new Employee(4, 3500));
    54. employees.add(new Employee(5, 3000));
    55. employees.add(new Employee(4, 4000));
    56. // 内部比较器:要排序的对象要求实现了Comparable接口
    57. Collections.sort(employees);
    58. System.out.println("通过内部比较器实现:");
    59. System.out.println(employees);
    60. List employees2 = new ArrayList();
    61. employees2.add(new Employee(2, 5000));
    62. employees2.add(new Employee(1, 4500));
    63. employees2.add(new Employee(4, 3500));
    64. employees2.add(new Employee(5, 3000));
    65. employees2.add(new Employee(4, 4000));
    66. // 外部比较器:自定义类实现Comparator接口
    67. Collections.sort(employees2, new EmployeeComparable());
    68. System.out.println("通过外部比较器实现:");
    69. System.out.println(employees2);
    70. }
    71. }
    72. /**
      • 自定义员工比较器
    73. *
    74. */
    75. class EmployeeComparable implements Comparator {
    76. @Override
    77. public int compare(Employee o1, Employee o2) {
    78. // 比较员工编号,如果此对象的编号大于、等于、小于指定对象,则返回1、0、-1
    79. int result = o1.getId() > o2.getId() ? 1 : (o1.getId() == o2.getId() ? 0 : -1);
    80. // 如果编号相等,则比较薪资
    81. if (result == 0) {
    82. // 比较员工薪资,如果此对象的薪资大于、等于、小于指定对象,则返回1、0、-1
    83. result = o1.getSalary() > o2.getSalary() ? 1 : (o1.getSalary() == o2.getSalary() ? 0 : -1);
    84. }
    85. return result;
    86. }
    87. }

    你要是还不理解外部和内部比较器的区别,最后再送你个例子:

    我和黄晓明谁比较帅?在我心里是不知道如何比较的,我不知道判断帅的标准是什么(这就相当于“我”这个实例,本身没有内部比较器),我现在很想很想知道答案,有两个方法,第一个是上网查资料,查判断帅的标准是啥,然后再比较(也就是实现内部比较器),第二个就是找一个裁判a,他知道判断标准是啥,让他来判断我们两个谁帅(相当于定义了一个外部比较器类a)

    编辑于 2018-05-24 00:38:11 回复(6)
    Comparable和Comparator都是接口。
    类实现Comparable接口可以使得类具备了比较性,必须实现接口的compareTo方法。在使用Collections.sort(List<T> list)或者Array.sort(Object[] a)对对象集合进行排序的时候,就会根据对象自定义的排序方法排序。
    类实现Comparator接口可以构建比较器,实现接口的compare方法。在使用Collections.sort(List<T> list,Comparator<? super T> c)或者Arrays.sort(T[] a,Comparator<? super T>c)进行对集合排序的时候,就会根据比较器产生的顺序对集合或数组排序。
    发表于 2017-03-09 08:23:26 回复(2)
    comparable和comparator都是用来实现集合中元素的的比较、排序的,只是comparable是在集合内部定义的方法实现的排序,comparator是在集合外部实现的排序。
    comparable是一个对象本身就已经支持自比较所需要实现的接口,(如string,interger自己就可以完成比较大小的操作,已经实现了comparable接口)
    而comparator是一个专用的比较器,当这个对象不支持自我比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
    发表于 2016-03-17 22:08:11 回复(0)
    Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。 Comparator位于包java.util下,而Comparable位于包 java.lang下 Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口) 自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序,如API所说: Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface 这里的自然顺序就是实现Comparable接口设定的排序方式。 而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。 可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。 用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。 比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。
    发表于 2016-03-06 23:36:30 回复(1)
    不多BB,上代码!
    package com.wangge;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @ClassName AAA
     * @Description TODO
     * @Author Wangzh8QvQ
     * @Date 2020/3/16 16:21
     * @Version 1.0
     */
    public class AAA {
        public static void main(String[] args) {
            List<Person> l = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                Person p = new Person();
                p.age = (int) (Math.random() * 100);
                p.money = (int) (Math.random() * 100000);
                l.add(p);
            }
    
            /**
             * 实现Comparable接口
             */
    //        Collections.sort(l);
            /**
             * Comparator使用方法。即自定义比较器。这种耦合度比较低。
             */
            //使用工具类
    //        Collections.sort(l, (o1, o2) -> o1.money-o2.money);
            //使用集合提供的sort方法。
            l.sort((a, b) -> a.age - b.age);
            l.forEach(s -> System.out.println(s));
        }
    }
    
    
    class Person implements Comparable<Person> {
        int age;
        int money;
    
        @Override
        public int compareTo(Person o) {
            return this.age - o.age;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "age=" + age +
                    ", money=" + money +
                    '}';
        }
    }
    


    编辑于 2020-03-16 17:04:52 回复(0)

    两种方式,各有各的特点:使用Comparable方式比较时,我们将比较的规则写入了比较的类型中,其特点是高内聚。但如果哪天这个规则需要修改,那么我们必须修改这个类型的源代码。如果使用Comparator方式比较,那么我们不需要修改比较的类,其特点是易维护,但需要自定义一个比较器,后续比较规则的修改,仅仅是改这个比较器中的代码即可。

    发表于 2018-04-13 11:12:56 回复(0)
    Comparable和Comparator分别是用于排序的, 如果一个类实现了 Comparable接口,也就意味着该类支持排序,如果一个类不支持排序,可以给该类创建一个比较器,实现排序。 总结 Comparable是一个类部比较器而 Comparator是一个外部比较器。
    发表于 2016-12-08 22:41:27 回复(0)
    Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。
    Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。
    发表于 2015-10-29 12:10:41 回复(1)
    说到比较器我们第一时间会想到equals,但是equals是用来比较是否相等的,Comparator或者Comparable是用来比较顺序的(也就是排序)。 比较器的概念 确定两个对象之间的大小关系及排列顺序称为比较,能实现这个比较功能的类或方法称之为比较器,在java中只有两种比较器。 比较器的分类 内部比较器(Comparable接口)和外部比较器(Comparator接口)。 内部比较器(简单点说就是把比较器写在类的内部)的概念 类实现了Comparable接口,然后重写了compareTo方法(这个方法可以看作比较器),这个类就拥有了内部比较器。注意,你一旦实现了比较器,就说明这个类支持排序,比如单例模式的类就不能进行排序。 下面看看Comparable接口的源码(了解下就行) package java.lang; public interface Comparable { public int compareTo(T o); 1)如果此对象(调用比较器方法的对象)大于指定对象(目标比较对象),返回正整数 2)如果此对象小于指定对象,返回负整数 3)如果此对象等于指定对象,返回零 } 外部比较器(简单点说就是把比较器写在类的外边,没错!就是在外边新定义了个比较器类!)的概念 新定义一个类,类名随意,但这个类必须实现Comparator接口,重写compare方法,我们把这个称作外部比较器。 下面看看Comparable接口的源码(了解下就行) package java.util; public interface Comparator { int compare(T o1, T o2); 1)如果o1大于o2,则返回正整数; 2)如果o1小于o2,则返回负整数 3)如果o1等于o2,则返回零 boolean equals(Object obj); //你是不是想问为什么这个方法不需要重写?对不起,我也不是特别清楚,但通常是把这个方法忽略掉,如果 必须要个说法,你可以说这个方法被默认实现了。 } 现在我们有两种比较器的实现方法,用的时候用哪种呢? 1.我们自定义一个类时,可以选择内部比较器,内部比较器很符合java封装的思想,也就是高内聚,但是!但是!但是!我们平时用到的类往往不是自定义的,而是别人已经写好并且已编译的类,我们只能调用,不能修改其源代码,这时我们就只能用外部比较器了。 2.还有种情况,我们用到的还是别人已经写好并且已编译的类,他写这个类的时候恰好也实现了内部比较器(我们常用的有基本类型的封装类,String,Date),但是他定义的这种比较方法,不是我们想要的(举个例子,integer的内部比较器是按照数字大小进行比较排序,但是我们的需求是按照数字的绝对值进行排序,这就很尴尬了),这时我们就只能用外部比较器了。 3.第三种情况,我们平时对对象进行排序,往往需要多种排序方式(举个例子,学生表的排序方式有学号排序,年龄排序,性别排序等等),这时我们也不得不用外部比较器了(也就是定义多个外部比较器类)。 由此看出,外部比较器比内部比较器更灵活,更易维护。 比较器的应用 最最常见的应用还是用在集合(list)和数组的sort()方法中,如果我们想用sort()方法,必须实现存储元素对象的内部比较器或者自定义一个用于存储元素对象之间的外部比较器,不然用sort()方法的时候容器会报错,它不知道用哪种方式进行排序。 下面贴个比较器和sort方法的应用Demo,自己体会一哈: /** 员工实体 @author Sam * */ public class Employee implements Comparable { private int id;// 员工编号 private double salary;// 员工薪资 public int getId() { return id; } public void setId(int id) { this.id = id; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public Employee(int id, double salary) { super(); this.id = id; this.salary = salary; } // 为了输出方便,重写toString方法 @Override public String toString() { // 简单输出信息 return "id:"+ id + ",salary=" + salary; } // 比较此对象与指定对象的顺序 @Override public int compareTo(Employee o) { // 比较员工编号,如果此对象的编号大于、等于、小于指定对象,则返回1、0、-1 int result = this.id > o.id ? 1 : (this.id == o.id ? 0 : -1); // 如果编号相等,则比较薪资 if (result == 0) { // 比较员工薪资,如果此对象的薪资大于、等于、小于指定对象,则返回1、0、-1 result = this.salary > o.salary ? 1 : (this.salary == o.salary ? 0 : -1); } return result; } } /** 测试两种比较器 @author Sam * */ public class TestEmployeeCompare { /** @param args */ public static void main(String[] args) { List employees = new ArrayList(); employees.add(new Employee(2, 5000)); employees.add(new Employee(1, 4500)); employees.add(new Employee(4, 3500)); employees.add(new Employee(5, 3000)); employees.add(new Employee(4, 4000)); // 内部比较器:要排序的对象要求实现了Comparable接口 Collections.sort(employees); System.out.println("通过内部比较器实现:"); System.out.println(employees); List employees2 = new ArrayList(); employees2.add(new Employee(2, 5000)); employees2.add(new Employee(1, 4500)); employees2.add(new Employee(4, 3500)); employees2.add(new Employee(5, 3000)); employees2.add(new Employee(4, 4000)); // 外部比较器:自定义类实现Comparator接口 Collections.sort(employees2, new EmployeeComparable()); System.out.println("通过外部比较器实现:"); System.out.println(employees2); } } /** 自定义员工比较器 * */ class EmployeeComparable implements Comparator { @Override public int compare(Employee o1, Employee o2) { // 比较员工编号,如果此对象的编号大于、等于、小于指定对象,则返回1、0、-1 int result = o1.getId() > o2.getId() ? 1 : (o1.getId() == o2.getId() ? 0 : -1); // 如果编号相等,则比较薪资 if (result == 0) { // 比较员工薪资,如果此对象的薪资大于、等于、小于指定对象,则返回1、0、-1 result = o1.getSalary() > o2.getSalary() ? 1 : (o1.getSalary() == o2.getSalary() ? 0 : -1); } return result; } } 你要是还不理解外部和内部比较器的区别,最后再送你个例子: 我和黄晓明谁比较帅?在我心里是不知道如何比较的,我不知道判断帅的标准是什么(这就相当于“我”这个实例,本身没有内部比较器),我现在很想很想知道答案,有两个方法,第一个是上网查资料,查判断帅的标准是啥,然后再比较(也就是实现内部比较器),第二个就是找一个裁判a,他知道判断标准是啥,让他来判断我们两个谁帅(相当于定义了一个外部比较器类a)
    发表于 2021-08-14 00:34:44 回复(0)

    <p>comparable和comparator都是可以对集合中元素进行比较、排序。</p><p>comparable是内部比较,可以对基本数据类型(int等)进行比较</p><p>comparator是外部比较器,对类进行比较,比如学生类中的年龄、成绩、学号等进行比较</p>

    就是集合中已经自带了comparable接口,比如你比较int类型的自带的comparable就会采用自然顺序排序,但是如果这个不满足你的要求,比如你想对整数加上绝对值之后的值排序,那么就要自定义一个comparator进行自定义的排序规则

    编辑于 2020-10-21 18:03:10 回复(0)
    Comparable和Comparator接口是干什么的?列出它们的区别。
    它们都是集合用来去重和排序的。
    Comparable接口要求集合内的元素实现它,并重写compareTo()方法,在这个方法内我们可以写比较和去重的逻辑,最常见的就是TreeMap类用它来实现对元素的排序和去重,Comparator接口要求我们自定义一个类来实现这个接口并重写compare()方法,在定义集合的时候把我们自定义的类的对象放入构造函数中。
    发表于 2020-06-29 08:31:27 回复(0)
    comparable和comparator都是用来实现集合中元素的的比较、排序的,只是comparable是在集合内部定义的方法实现的排序,comparator是在集合外部实现的排序
    发表于 2020-06-06 21:46:51 回复(0)

    用来实现集合中元素的比较和排序


    编辑于 2020-03-04 12:15:50 回复(0)

    都是实现比较从而排序。前者是在类的内部实现compareto方法,开销小,逻辑简单。后者是在类外部新建一个类实现compare和equals方法,开销大,逻辑复杂。

    发表于 2020-02-29 21:18:40 回复(0)
    comparable是集合内部的接口,compareto方法 comparator外部类的接口,重写compare和equal两个方法 两个都是可以给集合元素进行比较和排序
    编辑于 2019-11-20 19:30:43 回复(0)
    升序 o1小于o2 返回-1 降序 o1小于o2返回1
    发表于 2019-11-17 12:54:51 回复(0)