【问题标题】:How to sort ArrayList of extend classes?如何对扩展类的 ArrayList 进行排序?
【发布时间】:2016-10-28 10:00:03
【问题描述】:

这是一个主类Employee.java 和另外两个扩展主类的类。 ArrayList<Employee> 包含来自 createFixedEmployee.javacreatePerHourEmployee 的对象。如何将ArrayList中的对象按薪水排序,如果某些对象的薪水相同,则按字母顺序对其名称进行排序?

我尝试使用Comparator.comparing(); 但不起作用,我收到错误Cannot resolve method getMonthSalary(); 这是代码:

createPerHourEmployee.java

public class createPerHourEmployee extends Employee {
    private double salary;

    public createPerHourEmployee() {}

    public double getSalaryPerHour() { return this.salary; }

    public double setSalaryPerHour(double value) {
        return this.salary = value;
    }


    public createPerHourEmployee (int _id, String _name, double _salary) {
        setEmployeeID(_id);
        setEmployeeName(_name);
        this.salary = _salary;
    }

    public double getMonthSalary() {
        return salary * (20 * 0.8);
    }

    public String toString() {
        return getEmployeeID() + ", " + getEmployeeName() + ", " + getSalaryPerHour();
    }
}

createFixedEmployee.java

public class createFixedEmployee extends Employee {
    private double salary;

    public createFixedEmployee() {}

    public double getSalaryFixed() {
        return this.salary;
    }

    public double setSalaryFixed(double value) {
        return this.salary = value;
    }

    public createFixedEmployee(int _id, String _name, double _salary) {
        setEmployeeID(_id);
        setEmployeeName(_name);
        this.salary = _salary;
    }

    public double getMonthSalary() {
        return this.salary;
    }

    public String toString() {
        return getEmployeeID() + ", " + getEmployeeName() + ", " + getSalaryFixed();
    }

}

Employee.java

import java.util.ArrayList;
import java.util.Comparator;

public abstract class Employee {
    private int base_id;
    private String base_name;

    public int getEmployeeID () {
        return this.base_id;
    }

    public int setEmployeeID (int value) {
        return this.base_id = value;
    }

    public String getEmployeeName () {
        return this.base_name;
    }

    public String setEmployeeName(String value) {
        return this.base_name = value;
    }

    public abstract double getMonthSalary();

    public static void main(String[] argc) {
        ArrayList<Employee> Employee = new ArrayList<Employee>();
        Employee.add(new createPerHourEmployee(1, "asd", 1300));
        Employee.add(new createFixedEmployee(7, "asds", 14025));
        Employee.add(new createPerHourEmployee(2, "nikan", 1230));
        Employee.add(new createPerHourEmployee(3, "nikalo", 12330));
        Employee.add(new createFixedEmployee(6, "aaaa", 14025));
        Employee.add(new createFixedEmployee(4, "nikaq", 140210));
        Employee.add(new createFixedEmployee(5, "nikas", 124000));
        Employee.add(new createFixedEmployee(6, "nikab", 14025));


        Employee.sort(Comparator.comparing(Employee::getMonthSalary)
              .thenComparing(Employee::getEmployeeName)); // here is an error

    }
}

所以我尝试过使用

Employee.sort(Comparator.comparing(createFixedEmployee::getMonthSalary).
                thenComparing(createFixedEmployee::getEmployeeName));

效果很好,但我需要对所有类进行排序,而不仅仅是一个类。

【问题讨论】:

  • @Mureinik:我意识到这一点并在您发布的同时发布了答案。 :-)
  • @T.J.Crowder, Mureinik 哦,当然。我找不到这个问题..我会记下,谢谢

标签: java class sorting arraylist compiler-errors


【解决方案1】:

main 中,您为局部变量指定了名称Employee。这会影响您的 Employee 类的标识符。变量名无论如何都不应该以大写字母开头,应该在引用数组或列表时使用复数形式(除非它们以“list”或类似名称结尾),理想情况下不应该是与您的任何班级名称相同。

因此将变量更改为employees。修复这个问题,使用Employee::getMonthSalary 的版本和这样的作品:

employees.sort(Comparator.comparing(Employee::getMonthSalary)
      .thenComparing(Employee::getEmployeeName));

我还将createPerHourEmployee 更改为PerHourEmployee,因为Java 中压倒性的约定是类名以大写字母开头并且是名词,而不是动词。同样,createFixedEmployee 将是(比如说)SalariedEmployee

【讨论】:

    【解决方案2】:

    当对List&lt;T&gt; 进行排序时,您绝对可以使用对T 的任何祖先方法的函数引用。这里的问题在于您为列表提供的名称 - 您已将局部变量命名为 Employee,当您尝试在 Comparator 中创建函数引用时,它隐藏了类型 Employee 的名称。只要给它一个更好的名字,你应该没问题。例如:

    ArrayList<Employee> employeeList = new ArrayList<Employee>();
    // Or better yet: List<Employee> employeeList = new ArrayList<>();
    
    employeeList.add(new createPerHourEmployee(1, "asd", 1300));
    employeeList.add(new createFixedEmployee(7, "asds", 14025));
    employeeList.add(new createPerHourEmployee(2, "nikan", 1230));
    employeeList.add(new createPerHourEmployee(3, "nikalo", 12330));
    employeeList.add(new createFixedEmployee(6, "aaaa", 14025));
    employeeList.add(new createFixedEmployee(4, "nikaq", 140210));
    employeeList.add(new createFixedEmployee(5, "nikas", 124000));
    Employee.add(new createFixedEmployee(6, "nikab", 14025));
    
    
    employeeList.sort(Comparator.comparing(Employee::getMonthSalary)
          .thenComparing(Employee::getEmployeeName));
    

    【讨论】:

    • 能麻烦您回答我的小问题吗?如何按Comparator.comparing();降序排序?
    • 你可以使用Comparator.comparing(...).reversed()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2016-07-12
    • 2013-01-06
    • 2015-12-27
    • 1970-01-01
    相关资源
    最近更新 更多