2016-06-06 4 views
4

Ich habe die Anforderung, Objekte (Zone) mit ihren Namen (Zone Name: String) unter Berücksichtigung der Groß-/Kleinschreibung zu sortieren. Ich habe dies mit Java Comparator-Schnittstelle versucht.Sortieren von Objekten in Java mit Groß-/Kleinschreibung String-Schlüssel

class NameComparator implements Comparator<Zone> { 
    public int compare(Zone z1, Zone z2) { 
     return z1.getZoneName().compareTo(z2.getZoneName()); 
    } 
} 

Aber dieser Komparator nur lexikografisch sortieren.

Beispiel: Erforderliche Reihenfolge für die Zonennamen.

[ 'Zone Aaa3', 'Zone AAA3', 'Zone BBB7', 'Zone BBB7', 'Zone BBB7']

Stromausgang:

[ 'Zone Aaa3' , 'Zone BBB7', 'Zone BBB7', 'Zone AAA3', 'Zone BBB7']

gibt es eine Möglichkeit, dies zu erreichen, andere als ein rohes Objekt Sortiermethode zu schreiben?

Antwort

2

Die Logik optimieren, beide Namen in Kleinbuchstaben oder Großbuchstaben umwandeln und dann vergleichen.

public int compare(Zone z1, Zone z2){ 
    if(z1.getZoneName().toLowerCase().equals(z2.getZoneName().toLowerCase())) 
     return z1.getZoneName().compareTo(z2.getZoneName()); 
    else 
     return z1.getZoneName().toLowerCase().compareTo(z2.getZoneName().toLowerCase()); 
} 

Verwenden von Lambda -

Comparator<Zone> byName = (z1, z2)->{ 
    if(z1.getZoneName().toLowerCase().equals(z2.getZoneName().toLowerCase())) 
     return z1.getZoneName().compareTo(z2.getZoneName()); 
    else 
     return z1.getZoneName().toLowerCase().compareTo(z2.getZoneName().toLowerCase()); 
}; 
+0

Dann wird der Fall nicht considered.I müssen auch den Fall zu betrachten, . Ich kann diese Reihenfolge nicht garantieren, 'Zone AAa3' <'Zone aaa3' –

+0

aktualisierte Antwort - unterstützte Anwendungsfall 'Zone AAa3' <'Zone aaa3' –

+0

Ja, das funktioniert. Habe meinen Tag gerettet. Danke. –

7

Es gibt eine pre-defined comparator for case-insensitive sorting. Sie mit ihm nutzen kann ein Zoneby extracting a sort key.

Comparator<Zone> byName = Comparator 
    .comparing(Zone::getZoneName, String.CASE_INSENSITIVE_ORDER) 
    .thenComparing(Zone::getZoneName); 
+0

Das scheint nur für Java 8. Aber sieht wie ein einfacher Weg aus. Danke. –

+2

@shamikaDharmasiri Nun, Java 7 beendete den Support (einschließlich der Sicherheit) vor über einem Jahr, und Java 9 ist fast da. Strom zu bekommen ist eine Anstrengung wert. – erickson

+0

Dies löst jedoch nicht den Anwendungsfall der Bestellung ('Zone AAa3' <'Zone aaa3') - Wenn die Eingabe Zone aaa3, Zone AAa3 ist, gibt sie Zone AAa3, aaa3 nicht zurück. –

Verwandte Themen