2017-05-07 8 views
1

私はJavaを使い慣れていないので、ラムダ式とコンパレータを使って練習しようとしています。 は、私は他のゲッターとtoStringメソッドを使用してこのパブリッククラスPersonを持っている:Arrays.sort with Lambda and thenComparing

public class Person { 
    private String name; 
    private int age; 
    private int computers; 
    private double salary; 

public Person(String name, int age, int computers, double salary){ 
    this.name = name; 
    this.age = age; 
    this.computers = computers; 
    this.salary = salary; 
    } 

public String getName(){ 
    return this.name; 
} 

public int getAge(){ 
    return this.age; 
} 

public int getComputers(){ 
    return this.computers; 
} 

public double getSalary(){ 
    return this.salary; 
} 
@Override 
public String toString(){ 
    return "Name: " + getName() + ", age: "+ getAge() + 
      ", N° pc: " + getComputers() + ", salary: " + getSalary(); 
} 


} 

今、私は文字列(降順)することにより、第1の比較は、Person []リストをソートしたいと思い、その後、年齢によって(昇順)、次にコンピュータの数(降順)、最後に給与(昇順)で計算します。 compareToメソッドをオーバーライドすると昇順または降順でなければならないので、私はComparableを実装できません。私は両方を必要とします。 Comparatorクラスを自分で作成せずにそれを行うことが可能かどうかを知りたいと思います。基本的に私のコードはほとんど正しいですが、私はthenComparingInt(人:: getComputers)を逆にする方法がわからない...

import java.util.Arrays; 
import java.util.Comparator; 


public class PersonMain { 
    public static void main (String args[]){ 

    Person[] people = new Person[]{ 
      new Person("Adam", 30, 6, 1800), 
      new Person("Adam", 30, 6, 1500), 
      new Person("Erik", 25, 1, 1300), 
      new Person("Erik", 25, 3, 2000), 
      new Person("Flora", 18, 1, 800), 
      new Person("Flora", 43, 2, 789), 
      new Person("Flora", 24, 5, 1100), 
      new Person("Mark", 58, 2, 2400) 
    }; 

    Arrays.sort(people, Comparator.comparing(Person::getName).reversed() 
      .thenComparingInt(Person::getAge) 
      .thenComparingInt(Person::getComputers) 
      .thenComparingDouble(Person::getSalary) 
      ); 

    for (Person p: people) 
     System.out.println(p); 
    } 
} 

正しい出力は次のようになります。事前に

Name: Mark, age: 58, N° pc: 2, salary: 2400.0 
Name: Flora, age: 18, N° pc: 1, salary: 800.0 
Name: Flora, age: 24, N° pc: 5, salary: 1100.0 
Name: Flora, age: 43, N° pc: 2, salary: 789.0 
Name: Erik, age: 25, N° pc: 3, salary: 2000.0 
Name: Erik, age: 25, N° pc: 1, salary: 1300.0 
Name: Adam, age: 30, N° pc: 6, salary: 1500.0 
Name: Adam, age: 30, N° pc: 6, salary: 1800.0 

みんなありがとう!

+1

あなたが 'あなたのPersonクラスでgetters'を定義していないのはなぜ? –

答えて

4

私はあなただけで、別途パソコンComparatorを作成する必要があると思う:

Comparator.comparing(Person::getName).reversed() 
      .thenComparingInt(Person::getAge) 
      .thenComparing(Comparator.comparingInt(Person::getComputers).reversed()) 
      .thenComparingDouble(Person::getSalary) 
+0

ありがとうございます!それは働いた:) – FollettoInvecchiatoJr