2017-10-12 4 views
-3

J'ai un étudiant de classe avec le nom et le champ de département.Comment trier la liste alphabétiquement dans chaque groupe en Java

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

J'ai aussi ces données d'échantillon dans une liste-

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

Je veux qu'ils trier par ordre alphabétique dans chaque groupe afin que la sortie sera ressemble this-

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

I utilisé comparateur et essayé de trier la liste, mais cela ne fonctionne pas. On dirait que d'autres l'ont résolu en utilisant java 8 flux. Quelqu'un pourrait-il le résoudre en utilisant Stream api.

+6

"J'ai utilisé le comparateur et essayé de trier la liste mais cela ne fonctionne pas." Qu'est-ce qui n'a pas fonctionné? Quel code et quel était le problème? Une solution avec des flux est-elle acceptable? – Nathan

+0

Montrez votre comparateur –

+2

'A, Arts' devrait être avant' A, Science'? – Jerry06

Répondre

2

L'utilisation de flux nécessiterait également un comparateur. En fonction de la commande exacte dont vous avez besoin (départements d'abord ou noms en premier). Devrait probablement le rendre aussi sûr de 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

Si je comprends bien, vous devez d'abord regrouper par department et garder ce triés par ordre décroissant; tandis que les valeurs de chaque groupe doivent être triées par ordre croissant. Après le regroupement, vous devez recréer la liste dans l'ordre que vous avez spécifié.

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