2017-10-12 1 views
-3

Ich habe eine Klasse Student mit Namen und Abteilung Feld.Wie sortiere ich die Liste alphabetisch in jeder Gruppe in Java

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

Auch ich habe diese Beispieldaten in einer Listen-

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")); 

Ich möchte, dass sie in alphabetischer Reihenfolge in jeder Gruppe sortieren, so wird die Ausgabe sieht sein wie this-

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

I verwendet Komparator und versuchte, die Liste zu sortieren, aber es funktioniert nicht. Scheint wie andere löste es mit Java 8 Stream. Könnte jemand es mit Stream API lösen.

+6

"Ich habe Komparator verwendet und versucht, die Liste zu sortieren, aber es funktioniert nicht." Was hat nicht funktioniert? Welcher Code und was war das Problem? Ist eine Lösung mit Streams akzeptabel? – Nathan

+0

Zeigen Sie Ihren Vergleicher –

+2

'A, Arts' sollte vor' A, Science' stehen? – Jerry06

Antwort

2

Die Verwendung von Streams würde auch einen Komparator benötigen. Abhängig von der genauen Reihenfolge, die Sie benötigen (Abteilungen zuerst oder Namen zuerst). Sollte es wahrscheinlich auch null sicher machen.

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

Wenn ich richtig verstanden habe, müssen Sie zunächst Gruppe von department und dass in absteigender Reihenfolge sortiert halten; während die Werte in jeder Gruppe in aufsteigender Reihenfolge sortiert werden sollten.

Nach der Gruppierung müssen Sie die Liste in der von Ihnen angegebenen Reihenfolge neu erstellen.

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()) 
Verwandte Themen