So sortieren Sie eine Liste nach vorhandenen Eigenschaften

8

Ich verwende diese Zeile hier, um eine Liste basierend auf dem Objektnamen zu sortieren.

%Vor%

Wie sortiere ich es basierend auf "name", wenn es existiert, wenn nicht, ich möchte es nach "title" sortieren. Wenn beide existieren, möchte ich zuerst nach "name" und dann nach "title" sortieren.

Ich bin kein Groovy-Programmierer, also danke für die Hilfe im Voraus.

    
ajsie 04.03.2012, 22:13
quelle

3 Antworten

13

Ich bin mir nicht sicher, ob ich deine Frage richtig verstanden habe. Vielleicht ist etwas wie das, was Sie suchen:

%Vor%

Was in dieser scheinbar harmlosen Vergleichsfunktion passiert, ist eigentlich eine Menge Groovy-Syntax-Magie. Aber es ist nicht schwer zu folgen.

Zunächst wird die sort -Methode mit einer Binärfunktion aufgerufen, die als fungiert ein Komparator (dh nimmt zwei Argumente, a und b und gibt -1 zurück, wenn a & lt; b, 1 wenn a & gt; b und 0 wenn a == b).

Diese anonyme Funktion: { a, b -> a.name <=> b.name ?: a.title <=> b.title } benutzt den " Raumschiffoperator " ( <=> ... das ist ein Raumschiff Mann!), zuerst a und b mit Namen zu vergleichen.

Wenn die Namen gleich (oder beide Null) sind, dann ist das Ergebnis von a.name <=> b.name 0, was fälschlicherweise in "Elvis-Betreiber "( ?: ... stelle es sich als Smiley vor), dann wird das Ergebnis von a.title <=> b.title zurückgegeben.

Andernfalls, wenn das Ergebnis des Namensvergleichs nicht 0 ist, wird das im Elvis-Operator wahrheitsgemäß ausgewertet, und dieser Wert wird zurückgegeben.

Dies alles berücksichtigt, dass Sie Nullwerte mit Zeichenfolgen vergleichen können und dass 'any string' > null immer gilt (was dasselbe ist wie 'any string' <=> null == 1 ).

Das Endergebnis ist also, dass Elemente ohne Namen zuerst und nach Titel sortiert werden und dann die Elemente mit Namen und Titel zuerst nach Namen und dann nach Titel sortiert werden.

Ich hoffe, dass Sie danach gesucht haben. Wenn Sie eine andere Sortierung der sortierten Elemente erwarten würden, können Sie dies in den Kommentaren klären:)

Aktualisieren

Es gibt auch ein nicht sehr dokumentiertes Objekt OrderBy das kann in diesem Fall verwendet werden:

%Vor%     
epidemian 05.03.2012 00:58
quelle
4

Sie können die Sammlung mit Comparator sortieren.

%Vor%     
Arturo Herrero 05.03.2012 00:04
quelle
0

Dies ist meine völlig unerprobte Anstrengung, die wahrscheinlich mit Fehlern durchsetzt ist

%Vor%     
Dónal 05.03.2012 10:14
quelle

Tags und Links