„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie sortiere ich eine Liste von Objekten in Java mithilfe mehrerer Felder?

Wie sortiere ich eine Liste von Objekten in Java mithilfe mehrerer Felder?

Veröffentlicht am 07.11.2024
Durchsuche:385

 How to Sort a List of Objects in Java Using Multiple Fields?

Benutzerdefiniertes Sortieren von Listenobjekten mit mehreren Feldern in Java

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.

Das Problem

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.

Analyse

Ihr Code hat tatsächlich ein Problem. Lassen Sie uns das Problem analysieren und die richtige Lösung finden.

Richtiger Code

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

Alternative Lösungen

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.

Fazit

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.

Neuestes Tutorial Mehr>

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