Java – 如何以多种方式对对象进行排序:Arrays.sort(),Comparable

假设我有一个包含对象的数组,我有一些员工(对象)。 他们都有: int agedouble salary 。 我想对这个数组进行排序,以便我的类实现Comparable 。 我做了一个方法:

 public int compareTo(Employee other) { return Double.compare(salary, other.salary); } 

没关系,排序工作正常。 但我按double salary排序。 现在我想按int age排序那么现在呢? 我做了一个方法:

 public int compareAge(Employee other) { return Integer.compare(age, other.age); } 

我如何使用Arrays.sort() ? 我希望有可能使用这两种方法 – 按工资排序,按年龄排序。 谢谢你的帮助。

要实现对Employee引用集合进行排序的多种方法,您应该创建实现Comparator单独类。 所以你可能有:

 public class EmployeeAgeComparator implements Comparator { ... } public class EmployeeSalaryComparator implements Comparator { ... } 

然后,您只需将适当比较器的实例传递给Arrays.sort方法。

基本上,当有一个排序顺序是合理的默认值时,实现Comparable是好的 – 但是比较器允许你将“被比较的东西”与“进行比较的东西”分开。

作为旁注,使用double来表示货币值(如工资)是一个坏主意,因为二进制浮点的工作方式(例如,无法准确表示0.1)…使用BigDecimal ,或存储整数美分(或您正在使用的任何货币单位)。

您应该使用两个Comparator类而不是实现Comparable

简而言之,实现Comparable的类在单个方面与该类的实例相当。

实现Comparator的类将成为其他类的比较器介质。 这意味着您可以使用多个比较器来比较不同方面的类。 此外, Comparator类可以传递给sort方法,例如Collections.sort()Arrays.sort() ,以允许精确控制排序顺序,也可以用于控制某些数据结构的顺序,例如作为排序集或排序映射。

为了达到您的目的,您可以创建两个Comparator类,如:

 class SalaryComparator implements Comparator { int compare(Employee a, Employee b) { return Double.compare(a.salary, b.salary); } } class AgeComparator implements Comparator { int compare(Employee a, Employee b) { return Integer.compare(a.age, b.age); } } 

然后在调用排序方法时,您将传递一个您想要使用的Comparator

例如,如果您有一个ArrayList list并且您想按工资对其进行排序,则可以执行以下操作:

  Collections.sort(list, new SalaryComparator()); // sort the list by salaries 

或者,如果您有一个Employee[] array并且您希望按年龄对其进行排序,例如:

 Arrays.sort(array, new AgeComparator()); // sort the array by age