Während das Sortieren von Objekten in einer Liste basierend auf einem Feld unkompliziert ist, kann das Sortieren mithilfe mehrerer Felder etwas schwierig sein . Dieser Artikel befasst sich mit dem Problem der Sortierung nach mehreren Feldern und untersucht die verschiedenen in Java verfügbaren Lösungen.
Stellen Sie sich ein Szenario vor, in dem Sie eine Liste von „Bericht“-Objekten mit drei Feldern haben : ReportKey, StudentNumber und School. Sie möchten diese Liste anhand aller drei Felder in einer bestimmten Reihenfolge sortieren.
Der von Ihnen bereitgestellte Codeausschnitt versucht, die Liste mithilfe von Collections.sort mit einem benutzerdefinierten Komparator zu sortieren, aber aus irgendeinem Grund funktioniert die Sortierung nicht wie erwartet. Sie vermuten, dass möglicherweise ein Problem mit dem Code vorliegt.
Ihr Code hat tatsächlich ein Problem. Lassen Sie uns das Problem analysieren und die richtige Lösung finden.
Das Problem im bereitgestellten Code liegt in der Verkettung der drei Felder:
return (record1.getReportKey() record1.getStudentNumber() record1.getSchool()).compareTo(record2.getReportKey() record2.getStudentNumber() record2.getSchool());
Bei dieser Verkettung wird davon ausgegangen, dass die Felder von sind Typ String. In Ihrem Fall sind jedoch alle drei Felder als String-Typen definiert, sodass die Verkettung lediglich zu einem String-Vergleich führen würde. Dies ist wahrscheinlich nicht das, was Sie beabsichtigt haben.
Um die Felder korrekt zu vergleichen, müssen Sie sie einzeln und in der richtigen Reihenfolge vergleichen:
return Comparator.comparing(Report::getReportKey)
.thenComparing(Report::getStudentNumber)
.thenComparing(Report::getSchool)
.compare(record1, record2);
Zusätzlich zum korrigierten Code finden Sie hier alternative Lösungen für die Sortierung nach mehreren Feldern in Java:
Option 1: Reflektierende Sortierung mit BeanComparator
BeanComparator kann zum Sortieren von Objekten basierend auf Gettern verwendet werden. Allerdings ist es aufgrund der Reflektion-Nutzung fehleranfällig und weniger effizient.
Option 2: Google Guava-Vergleichskette
Google Guava bietet eine praktische Möglichkeit, mehrere Vergleiche zu verketten. Es verarbeitet auch Nullwerte ordnungsgemäß.
Option 3: Apache Commons CompareToBuilder
Diese Bibliotheksklasse ähnelt Guavas CompareChain, weist jedoch ein etwas anderes Standardverhalten für Nullwerte auf.
Die richtige Lösung für Ihr Problem besteht darin, den überarbeiteten Code mit einzelnen Feldvergleichen zu verwenden. Alternativ können Sie je nach Ihren spezifischen Anforderungen eine der anderen oben besprochenen Optionen wählen. Wenn Sie die Prinzipien der Sortierung nach mehreren Feldern und die Unterschiede zwischen den verfügbaren Tools verstehen, können Sie komplexe Sortierszenarien in Ihren Java-Anwendungen effektiv bewältigen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3