【问题标题】:How does sorting works in Java with reference to Comparable and Comparator?参考 Comparable 和 Comparator 在 Java 中排序是如何工作的?
【发布时间】:2017-08-31 11:03:32
【问题描述】:

我有一个 Employee 类实现 Comparable 接口

public class Employee implements Comparable<Employee> {

        private int id;
        private String name;
        private int age;
        private long salary;

        public Employee(int id, String name, int age, int salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.salary = salary;
        }

        @Override
        public int compareTo(Employee emp) {
        return (this.id - emp.id);
        }

        @Override
        public String toString() {
        return "[id=" + this.id + ", name=" + this.name + ", age=" + this.age + ", salary=" +
            this.salary + "]";
        }

}

我有一个 Employee[] 数组我正在使用 Arrays.sort() 对数组进行排序

Employee[] empArr = new Employee[4];
empArr[0] = new Employee(10, "Mikey", 25, 10000);
empArr[1] = new Employee(20, "Arun", 29, 20000);
empArr[2] = new Employee(5, "Lisa", 35, 5000);
empArr[3] = new Employee(1, "Pankaj", 32, 50000);

Arrays.sort(empArr);

我的问题是如何在内部进行排序, 是不是像emArr[0].compareTo(emArr[1]) 然后根据需要交换元素?

我想知道内部是如何进行比较和交换的? Comparatable's compareTo(Object o)Comparator's compare(o1,o2) 扮演什么角色?

【问题讨论】:

  • 在谷歌上搜索你会发现很多例子说明在这种情况下排序是如何工作的。
  • 当然,不同的排序算法排序不同。了解 SelectionSort、Quicksort、MergeSort 等
  • 我确实搜索了很多
  • 你有没有试过自己查看Arrays.sort()的源代码?
  • @piechuckerr:Comparator 和 Comparable 只是让排序知道哪些元素应该被视为“更大”。它们基本上是您定义自己的&gt;&lt; 的方式。那里没有什么特别的。

标签: java sorting collections comparator comparable


【解决方案1】:

Comparable 表示自然排序。一般来说,如果A.compareTo(B) == 0A.equals(B) == true(这是一般惯例,并不总是遵循)。

Comparator 在您想要按自然顺序以外的其他内容进行排序时使用。例如,您想对一个整数数组进行排序,以便所有偶数首先出现。

Arrays.sort() 正在使用合并排序。有关详细信息,请参阅Arrays API。

【讨论】:

    【解决方案2】:

    已经有排序技术可以按顺序排列任何项目集合。 Java 实用程序类(如数组、集合)使用这些技术。 要使任何此类排序技术发挥作用,重要的是定义如何确定两个对象中的哪一个更大。

    如果对象的类实现Comparable 接口,则此信息在compareTo() 的实现中提供。

    此信息也可以在Comparator 类的compare() 方法的实现中提供。如果您想根据要求定义不同的排序(可能基于运行时的某些参数),比较器类很有用。实体的类可能实现了 Comparable 接口,但我们希望在某些特定情况下排序具有不同的顺序或基于其他一些参数。

    阅读更多Comparablehttps://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

    Comparatorhttps://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

    【讨论】:

      猜你喜欢
      • 2019-06-08
      • 1970-01-01
      • 2014-04-04
      • 2020-11-22
      • 2011-01-17
      • 1970-01-01
      • 2016-04-05
      • 2019-09-05
      • 2013-01-28
      相关资源
      最近更新 更多