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

时间:2014-09-28 09:06:22

标签: java arrays sorting comparator comparable

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

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()?我希望有可能使用这两种方法 - 按工资排序,按年龄排序。谢谢你的帮助。

2 个答案:

答案 0 :(得分:9)

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

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

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

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

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

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

答案 1 :(得分: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);
    }
}

然后在调用排序方法时,您需要传递Comparator

例如,如果你有一个ArrayList<Employee> list而你想按工资对它进行排序,你可以这样做:

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

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

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