Nette allgemeine Art, Nullen nach unten zu sortieren, egal?

7

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:

  • Einfach getrennt aufsteigend schreiben und absteigende Komparatoren, Freigabecode wo möglich
  • Delegieren der Nullbehandlung an einen anderen Klasse, entweder durch Werfen einer NPE oder indem Sie es explizit aufrufen
  • Fügen Sie eine aufsteigende Flagge hinzu und setzen Sie sie bedingte Logik in ihm zu navigieren um die Nullen
  • Wrap reguläre Komparatoren in a Nullbehandlungsklasse

Irgendwelche anderen Strategien? Ich würde gern von irgendwelchen Erfahrungen mit verschiedenen Ansätzen und Fallstricken für die verschiedenen Strategien hören.

    
Carl Manaster 11.08.2009, 17:47
quelle

5 Antworten

5

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 ...

meine

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

%Vor%

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 .

    
Jon Skeet 11.08.2009, 17:56
quelle
10

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%     
dfa 11.08.2009 18:28
quelle
5

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.

    
Carl Manaster 11.08.2009 18:56
quelle
3

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:

%Vor%

Wenn Sie eine Reihe von Früchten nach ihrer Größe sortieren möchten und die null s am Ende einfügen:

%Vor%

Sie können einfach schreiben:

%Vor%

Und das Ergebnis wäre:

%Vor%     
Ali Dehghani 08.08.2016 20:09
quelle
2

Sie können immer % verwenden. co_de% aus Commons-Sammlungen. Es ist länger als Google Sammlungen.

    
Tim R 12.08.2009 01:31
quelle