Ein Ansatz besteht darin, nach einer Klasse zu gruppieren, die alle Felder enthält, die Sie gruppieren möchten. Diese Klasse muss diese Felder hashCode
und equals
mit alle implementieren, um wie erwartet zu funktionieren.
In Ihrem Beispiel hierfür wäre:
public class SubjectAndSemester {
private final String subject;
private final int semester; // an enum sounds better
public SubjectAndSemester(String subject, int semester) {
this.subject = subject;
this.semester = semester;
}
// TODO getters and setters, hashCode and equals using both fields
}
Dann sollten Sie diese Methode in Ihrer Student
Klasse erstellen:
public SubjectAndSemester bySubjectAndSemester() {
return new SubjectAndSemester(subject, semester);
}
Jetzt können Sie sich wie folgt dar:
Map<SubjectAndSemester, List<Student>> studlistGrouped = studlist.stream()
.collect(Collectors.groupingBy(Student::bySubjectAndSemester));
Dies erstellt eine einstufige Gruppierung von Schülern.
Es gibt eine andere Option, die Sie ein Tuple
verwenden erfordert keine oder eine neue Klasse Gruppe zu erstellen. Ich meine, Sie eine n -Niveau Gruppierung von Studenten haben können, durch nachgeschaltete groupingBy
Kollektoren:
Map<String, Map<Integer, List<Student>>> studlistGrouped = studlist.stream()
.collect(Collectors.groupingBy(Student::getSubject,
Collectors.groupingBy(Student::getSemester)));
Dies schafft eine 2-Level-Gruppierung, so dass die zurück Struktur ist nun eine Karte von Karten von Listen. Wenn Sie damit leben können, selbst wenn Sie mehrere Ebenen gruppieren, können Sie vermeiden, eine Klasse zu erstellen, die als Schlüssel der Karte fungiert.
Vielen Dank für Ihre Antwort. Deine Antwort sieht gut aus, aber mein Problem ist, dass ich mein Beispiel hier vereinfacht habe. Basierend auf der Benutzerauswahl sollte ich nicht nach Gruppen gruppieren oder mit bis zu 8 Variablen gruppieren. In Ihrer ersten Lösung sollte ich Tausende von verschiedenen Kombinationen für jede Möglichkeit erstellen. – drJava
@drJava Nicht unbedingt ... Sie könnten in Ihrem feinkörnigsten Szenario eine Klasse mit diesen 8 Feldern erstellen, nach denen Sie gruppieren möchten. Wenn der Benutzer dann nicht 8 Felder zum Gruppieren ausgewählt hat, setzen Sie einfach die nicht ausgewählten Felder auf "null" und machen "hashCode" und "equals" so, als wären diese Nullfelder nicht vorhanden, dh "hashCode" für ein Nullfeld sollte 0 sein. Und für "equals" einfach mit "null" vergleichen. Eclipse und IntelliJ machen das automatisch für Sie. –
Das heißt, ich brauche nur eine Methode, wie bySubjectAndSemester in Ihrem Beispiel und die Felder zu erzeugen, die durch nicht gruppiert werden soll, null gesetzt werden und der Rest ist, wie Sie in Ihrem Kommentar geschrieben haben? – drJava