Java 中的排序如何参考 Comparable 和 Comparator?
How does sorting works in Java with reference to Comparable and Comparator?
我有一个 class 员工实现了 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)
扮演什么角色?
Comparable
表示自然排序。一般来说 if A.compareTo(B) == 0
then A.equals(B) == true
(这是一个并不总是遵循的通用约定)。
Comparator
当您想按非自然顺序排序时使用。例如,您想要对一个整数数组进行排序,以便所有偶数首先出现。
Arrays.sort()
正在使用合并排序。有关详细信息,请参阅 Arrays API。
已经有用于按顺序排列任何项目集合的排序技术。 Java 实用程序 class 像数组、集合一样使用这些技术。
要使任何此类排序技术发挥作用,重要的是要定义如何确定两个对象中哪个更大。
在对象的 class 实现 Comparable
接口的情况下,此信息在 compareTo()
的实现中提供。
此信息也可以在 Comparator
class 的 compare()
方法的实现中提供。比较器 class 在您想根据要求定义不同的顺序时很有用(可能基于 运行 期间的某些参数)。实体的 class 可能实现 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
我有一个 class 员工实现了 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)
扮演什么角色?
Comparable
表示自然排序。一般来说 if A.compareTo(B) == 0
then A.equals(B) == true
(这是一个并不总是遵循的通用约定)。
Comparator
当您想按非自然顺序排序时使用。例如,您想要对一个整数数组进行排序,以便所有偶数首先出现。
Arrays.sort()
正在使用合并排序。有关详细信息,请参阅 Arrays API。
已经有用于按顺序排列任何项目集合的排序技术。 Java 实用程序 class 像数组、集合一样使用这些技术。 要使任何此类排序技术发挥作用,重要的是要定义如何确定两个对象中哪个更大。
在对象的 class 实现 Comparable
接口的情况下,此信息在 compareTo()
的实现中提供。
此信息也可以在 Comparator
class 的 compare()
方法的实现中提供。比较器 class 在您想根据要求定义不同的顺序时很有用(可能基于 运行 期间的某些参数)。实体的 class 可能实现 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