参考Comparable和Comparator,如何在Java中进行排序?

时间:2017-04-05 17:27:33

标签: java sorting collections comparator comparable

我有一个实现Comparable接口的类Employee

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)正在扮演什么角色?

2 个答案:

答案 0 :(得分:1)

已经有排序技术用于安排订单中的任何项目集合。像Arrays,Collections这样的Java实用程序类使用这些技术。 要使任何此类排序技术起作用,定义如何确定两个对象中哪一个更大是很重要的。

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

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

详细了解Comparable https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

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

答案 1 :(得分:0)

Comparable意味着自然的顺序。一般来说,如果是A.compareTo(B) == 0,那么A.equals(B) == true(这是一个并不总是遵循的一般惯例)。

当您想要按自然顺序以外的其他方式进行排序时,会使用

Comparator。例如,您想要对整数数组进行排序,以便首先显示所有偶数。

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

相关问题