Ich schreibe einige benutzerdefinierte Vergleicher, und ich möchte, dass sie null Elemente an den unteren Rand der Liste schieben, unabhängig davon, ob ich aufsteigend oder absteigend sortiere. Was ist eine gute Strategie oder ein gutes Muster dafür?
Offhand:
Irgendwelche anderen Strategien? Ich würde gern von irgendwelchen Erfahrungen mit verschiedenen Ansätzen und Fallstricken für die verschiedenen Strategien hören.
Die letzte Option gefällt mir sehr. Komparatoren sind wirklich großartig, um zusammen zu ketten. Insbesondere möchten Sie vielleicht ein ReverseComparator
sowie ein NullWrappingComparator
schreiben.
EDIT: Sie müssen das nicht selbst schreiben. Wenn Sie sich die Bestellung Google Sammlungen-Bibliothek findest du diese und alle möglichen anderen Extras:
EDIT: Gehen Sie ins Detail, um zu zeigen, was ich mit ReverseComparator
...
Ein Wort der Warnung - in der Implementierung von ReverseComparator
, kehren Sie die Reihenfolge der Argumente um, anstatt das Ergebnis zu negieren, sonst wird Integer.MIN_VALUE
für sich selbst "umgekehrt".
Diese Implementierung ist also falsch (angenommen, original
ist der Komparator, der umgekehrt werden soll):
aber das ist richtig:
%Vor% Der Grund ist, dass wir den Vergleich immer umkehren möchten, aber wenn original.compare(x, y)
int.MIN_VALUE
zurückgibt, dann gibt der schlechte Vergleich auch int.MIN_VALUE
zurück, was falsch ist. Dies liegt an der witzigen Eigenschaft int.MIN_VALUE == -int.MIN_VALUE
.
Ich stimme Jon Skeet zu (es ist so einfach :). Ich habe versucht, einen sehr einfachen Dekorateur zu implementieren:
%Vor%bei einem Vergleicher:
%Vor%und einige Testdaten:
%Vor%Sie können mit Nullen am Ende sortieren:
%Vor% %Vor%oder zu Beginn:
%Vor% %Vor%Nach dfas Antwort - was ich will ist, dass die Nullen am Ende sortieren, ohne die Reihenfolge der Nicht-Nullen zu beeinflussen. Also möchte ich etwas mehr in diesem Sinne:
%Vor%Volle Anerkennung für dfa, das ist nur eine kleine Änderung seiner Arbeit.
In Java 8 können Sie das Comparator.nullsLast
und Comparator.nullsFirst
statische Methoden, um mehr Null-freundliche Komparatoren zu haben. Angenommen, Sie haben eine Fruit
-Klasse wie die folgende:
Wenn Sie eine Reihe von Früchten nach ihrer Größe sortieren möchten und die null
s am Ende einfügen:
Sie können einfach schreiben:
%Vor%Und das Ergebnis wäre:
%Vor%Sie können immer % verwenden. co_de% aus Commons-Sammlungen. Es ist länger als Google Sammlungen.
Tags und Links java design-patterns comparator