2016-06-26 8 views
2

ここにメインクラスEmployee.javaと、メインクラスを拡張する2つのクラスがあります。 ArrayList<Employee>には、createFixedEmployee.javacreatePerHourEmployeeのオブジェクトが含まれています。給与でArrayListのオブジェクトをソートする方法と、同じ給与を受け取ったオブジェクトの中に名前をアルファベット順にソートする方法がありますか?拡張クラスのArrayListを並べ替える方法は?

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

} 

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:

私は、私がここでエラーCannot resolve method getMonthSalary();がコードのget Comparator.comparing();を使用しようとしたが、動作しません。

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 

    } 
} 

ので、私はそれが正常に動作しますが、私は、すべてのクラスの1クラスではないだけをソートする必要がある

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

を使用しようとしました。 main

+0

@ムレイニク:私はそれを実感し、同時に回答を掲載しました。 :-) –

+1

@ T.J.Crowder、Mureinik確かに。私はこの問題を見つけることができませんでした..私はそれを書き留めます、ありがとうございます – phen0men

答えて

2

、あなたは間違いなくTの祖先の方法のうちのいずれかに機能的な参照を使用することができます。ここで問題となるのは、リストに指定した名前です。ローカル変数Employeeの名前を付けて、に関数参照を作成しようとすると、タイプ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)); 
+0

私はミニ質問に答えるためにあなたを困らせることはできますか? 'Comparator.comparing();'を降順でソートする方法は? – phen0men

+2

'Comparator.comparing(...)。reversed()'を使うことができます。 –

1

、あなたのローカル変数名Employeeを与えてくれました。これはあなたのEmployeeクラスの識別子を示しています。変数名は大文字で始めるべきではありません。でなければなりません。配列やリストを参照する際には複数形でなければなりません( "list"などで終わる場合を除きます)。理想的には、クラス名。

のでemployeesに変数を変更します。それを修正し、Employee::getMonthSalaryを使用したバージョンと、このような作品:

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

クラス名は大文字で始まり、名詞であるためにJavaで圧倒的な大会があるので、私はまたにcreatePerHourEmployeeを変更します、ではありません動詞。同様に、createFixedEmployeeは、例えば、SalariedEmployeeとなります。 List<T>をソートする場合

関連する問題