在Java ArrayList中排序对象块

时间:2014-06-16 12:30:05

标签: java android object arraylist

我有一个数据块,我想根据年龄和工资对它们进行排序。

对象Employee有:

  • 名称
  • 指定
  • 年龄
  • 薪酬

我想排序,以便最大年龄在最高位置。但是如果年龄相同的是两个人,那么它将比较他们之间的薪水,然后对于年龄和薪水高的人,他将在ArrayList的顶部。

在顶部列表中相应:Bob,Tim,Tom。然后在列表中:Alex,Sam,Craig等。

List<Employee> listEmployees = new ArrayList<Employee>(); 
listEmployees.add(new Employee("Tom", "Developer", 45, 80000));
listEmployees.add(new Employee("Sam", "Designer", 30, 75000));
listEmployees.add(new Employee("Bob", "Designer", 45, 134000));
listEmployees.add(new Employee("Peter", "Programmer", 25, 60000));
listEmployees.add(new Employee("Tim", "Designer", 45, 130000));
listEmployees.add(new Employee("Craig", "Programmer", 30, 52000));
listEmployees.add(new Employee("Anne", "Programmer", 25, 51000));
listEmployees.add(new Employee("Alex", "Designer", 30, 120000));

我尝试过使用

Collections.sort(Employees , new Comparator<listEmployees >() {
@Override
public int compare(EmployeeModelCls lhs, EmployeeModelCls rhs) {
return (rhs.getAge() - lhs.getAge());
}
});

我也试过

Collections.sort(Employees , new Comparator<listEmployees >() {
@Override
public int compare(EmployeeModelCls lhs, EmployeeModelCls rhs) {
return ((rhs.getAge() - lhs.getAge()) - (rhs.getSalary() - lhs.getSalary()));
}
});

但无法获得正确的数据。有没有人有任何想法?

3 个答案:

答案 0 :(得分:2)

让比较器尽可能自然,因为它可以让您清楚地了解员工的比较方式。例如,

Collections.sort(Employees , new Comparator<listEmployees >() {
  public int compare(EmployeeModelCls lhs, EmployeeModelCls rhs) {
    if (lhs.getAge() < rhs.getAge()) {
      return 1;
    } else if (lhs.getAge() > rhs.getAge()) {
      return -1;
    } else {
      if (lhs.getSalary() < rhs.getSalary()) {
        return 1;
      } else if (lhs.getSalary() > rhs.getSalary()) {
        return -1;
      } else {
        return 0;
      }
    }
  }
});

执行此操作后,您可以优化比较器。例如,

Collections.sort(Employees , new Comparator<listEmployees >() {
  public int compare(EmployeeModelCls lhs, EmployeeModelCls rhs) {
    return (rhs.getAge() == lhs.getAge()) ? (rhs.getSalary() - lhs.getSalary()) : (rhs.getAge() - lhs.getAge());
  }
});

如您所见,我们仅在年龄相同时才比较工资。在您的代码中,即使年龄不同,您也可以比较工资。这就是问题所在。

答案 1 :(得分:1)

考虑使用guava的ordering实用程序来创建compound比较器。在这种特殊情况下,你需要将2个比较器组合在一起,首先是年龄然后是工资。

答案 2 :(得分:0)

也许这样试试

Collections.sort(listEmployees , new Comparator<listEmployees >() {
    @Override
    public int compare(EmployeeModelCls lhs, EmployeeModelCls rhs) {
        if (rhs.getAge() - lhs.getAge() == 0)
            return rhs.getSalary() - lhs.getSalary();

        return (rhs.getAge() - lhs.getAge());
    }
});