簡體   English   中英

在Java ArrayList中排序對象塊

[英]Sort block of Objects in Java 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()));
}
});

但無法獲得正確的數據。 有人有什么想法嗎?

使比較器盡可能自然,因為它可以讓您清楚地了解員工的比較方式。 例如,

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());
  }
});

如您所見,我們僅在年齡相同時才比較工資。 在您的代碼中,即使年齡不同,您也可以比較工資。 這就是問題。

考慮使用guava的排序實用程序來創建復合比較器。 在這種特殊情況下,你需要將2個比較器組合在一起,首先是年齡然后是工資。

也許試試這種方式

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());
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM