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

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

DDD
DDDOriginal
2024-10-28 14:17:02228Durchsuche

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

Benutzerdefinierte Sortierung 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 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:

<code class="java">return (record1.getReportKey() + record1.getStudentNumber() + record1.getSchool()).compareTo(record2.getReportKey() + record2.getStudentNumber() + record2.getSchool());</code>

Diese Verkettung geht davon aus, dass die Felder vom Typ String sind. 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 richtig zu vergleichen, müssen Sie sie einzeln und in der richtigen Reihenfolge vergleichen:

<code class="java">return Comparator.comparing(Report::getReportKey)
        .thenComparing(Report::getStudentNumber)
        .thenComparing(Report::getSchool)
        .compare(record1, record2);</code>

Alternative Lösungen

In Zusätzlich zum korrigierten Code finden Sie hier alternative Lösungen zum Sortieren nach mehreren Feldern in Java:

Option 1: Reflektierende Sortierung mit BeanComparator

BeanComparator kann zum Sortieren von Objekten verwendet werden basierend auf Gettern. Es ist jedoch fehleranfällig und aufgrund der Reflektion-Nutzung weniger effizient.

Option 2: Google Guava CompareChain

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.

Das obige ist der detaillierte Inhalt vonWie sortiere ich eine Liste von Objekten in Java mithilfe mehrerer Felder?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn