2017-10-12 3 views
-3

名前と部署のあるクラスの学生がいます。Javaの各グループでアルファベット順にリストを並べ替える方法

class Student{ 
    String name; 
    String department; 
    public Student(String name, String department){ 
     this.name = name; 
     this.department = department; 
    } 
} 

はまた、私は出力がthis-

A, Science 
C, Science 
D, Science 
L, Science 
A, Arts 
B, Arts 
C, Arts 
X, Arts 

私のようなルックスになりますので、私は彼らがそれぞれのグループでアルファベット順にソートしたいリスト -

List<Student>students = new ArrayList<>(); 
    students.add(new Student("A", "Science")); 
    students.add(new Student("B", "Arts")); 
    students.add(new Student("L", "Science")); 
    students.add(new Student("C", "Science")); 
    students.add(new Student("D", "Science")); 
    students.add(new Student("A", "Arts")); 
    students.add(new Student("X", "Arts")); 
    students.add(new Student("C", "Arts")); 

でこれらのサンプルのデータを持っていますコンパレータを使用してリストをソートしようとしましたが、動作しません。他のJava 8ストリームを使用して解決したようです。誰もストリームAPIを使用して解決することができます。

+6

"コンパレータを使用してリストをソートしようとしましたが、機能しません。"何がうまくいかなかったのですか?どのようなコードと何が問題でしたか?許容できるストリームのソリューションですか? – Nathan

+0

コンパイラを表示 –

+2

'A、Arts'は' A、Science'の前にあるはずですか? – Jerry06

答えて

2

ストリームを使用すると、コンパレータも効果的に必要になります。あなたが必要とする正確な注文に応じて(最初の部門または最初の名前)。おそらくそれをnullでも安全にする必要があります。

List<Student> sortedStudents = students.stream().sorted((o1, o2) -> { 
    int depDiff = o1.department.compareTo(o2.department); 
    if (depDiff == 0) { 
     return o1.name.compareTo(o2.name); 
    } 
    return depDiff; 
}).collect(Collectors.toList()); 
0

私はdepartmentにより、正しくグループにあなた最初の必要性を理解し、降順にソートすることを続ければ、各グループの値は昇順にソートする必要があります。

グループ化した後、指定した順序でリストを再作成する必要があります。

students.stream() 
      .collect(Collectors.groupingBy(
        Student::getDepartment, 
        () -> new TreeMap<>(Comparator.<String> reverseOrder()), 
        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getName))))) 
      .entrySet() 
      .stream() 
      .flatMap(e -> e.getValue().stream().map(x -> new Student(x.getName(), e.getKey()))) 
      .collect(Collectors.toList()) 
関連する問題