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

Ric*_*rdK 5 java arrays sorting comparable comparator

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

public int compareTo(Employee other) {
    return Double.compare(salary, other.salary);
}
Run Code Online (Sandbox Code Playgroud)

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

public int compareAge(Employee other) {
    return Integer.compare(age, other.age);
}
Run Code Online (Sandbox Code Playgroud)

我怎么Arrays.sort()用这个呢?我希望有可能使用这两种方法 - 按工资排序,按年龄排序.谢谢你的帮助.

Jon*_*eet 9

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

public class EmployeeAgeComparator implements Comparator<Employee> {
    ...
}

public class EmployeeSalaryComparator implements Comparator<Employee> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @RichardK:该类没有将它们作为属性公开在某处?您可以创建使用匿名内部类创建比较器的方法,但使用属性会更清晰 IMO。按不可观察值排序是相当奇怪的。 (2认同)

nem*_*035 5

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

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

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

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

class SalaryComparator implements Comparator<Employee> {
    int compare(Employee a, Employee b) {
        return Double.compare(a.salary, b.salary);
    }
}

class AgeComparator  implements Comparator<Employee> {
    int compare(Employee a, Employee b) {
        return Integer.compare(a.age, b.age);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

 Collections.sort(list, new SalaryComparator()); // sort the list by salaries
Run Code Online (Sandbox Code Playgroud)

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

Arrays.sort(array, new AgeComparator()); // sort the array by age
Run Code Online (Sandbox Code Playgroud)

  • 这里的一个额外好处是`Collections.sort()`保证是保守的.如果您希望按工资对员工进行分类,而按年龄分类相同的员工,您需要做的就是先按年龄排序,然后按薪水排序. (3认同)