2009-09-14 3 views
7

was ich erreichen möchte, ist eine Sammlung von Objekten durch einen String-Wert zu sortieren. Jedoch in einer locale-abhängigen Weise mit einem Collator. Aus Gründen der Performance möchte ich nicht die Collator-Methode compare() (wie unten im Code) verwenden, sondern die CollationKey-Klasse, da die Java-API angibt, dass die Verwendung eines CollationKey viel schneller ist.Java: Sortieren einer Sammlung mit einem CollatorKey

Aber wie implementiere ich die compareTo() Methode mit dem CollationKey? Soweit ich es verstanden habe, muss ich alle Vergleichsmethoden komplett selbst schreiben, wenn ich einen CollationKey verwende. Daher kann ich die Collections.sort() -Methode nicht mehr verwenden. Ich bin sehr dankbar für ein Beispiel, das leicht zu verstehen ist und die effizienteste Implementierung ist, um die Sammlung von Person-Objekten mit einem CollationKey zu sortieren.

Vielen Dank!

public class Person implements Comparable<Person> { 

String lastname; 

public int compareTo(Person person) { 
    //This works but it is not the best implementation for a good performance 
    Collator instance = Collator.getInstance(Locale.ITALY); 
    return instance.compare(lastname, person.lastname); 
} 
} 

... 
ArrayList list = new ArrayList(); 
Person person1 = new Person("foo"); 
list.add(person1); 
Person person2 = new Person("bar"); 
list.add(person2); 
Collections.sort(list); 
... 

Antwort

13
class Person implements Comparable<Person> { 

    private static final Collator collator = Collator.getInstance(Locale.ITALY); 

    private final String lastname; 

    private final CollationKey key; 

    Person(String lastname) { 
    this.lastname = lastname; 
    this.key = collator.getCollationKey(lastname); 
    } 

    public int compareTo(Person person) { 
    return key.compareTo(person.key); 
    } 

} 
+0

Hallo Erickson, vielen Dank für die intelligente Lösung, ich werde es so implementieren, danke! – jan

0
  1. erstellen SortedMap m, wobei T die Art der Objekte, die Sie mit CollationKeys sortieren möchten. Sie können Sie
  2. Für jedes e Element TreeMap als Implementierung verwenden möchten, sortieren, m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);

Iterieren über m.values() sollte durch die Zeichenfolge Ihre Objekte, sortiert ergeben Sie CollationKeys verwenden möchten.

Ich glaube, das ist nicht effizient, aber es sollte funktionieren.

+0

Ericksons Antwort auf eine effizientere Lösung führt. – alex

+0

In meinem Fall konnte die akzeptierte Lösung nicht implementiert werden und diese funktionierte perfekt. –

-2

Verwenden Sie einen Komparator anstelle von Person Comparable. Ihr Comparator kann 2 Persion-Instanzen nehmen und diese basierend auf einer Collator-Instanz vergleichen. dann rufen

Collections.sort(list, myPersonComparator); 
+0

Das Problem liegt darin, den collationKey im Comparator zu speichern, so dass er nicht wiederholt berechnet wird ... – alex

+0

ah, ich sehe das Problem. Ich habe Collators überhaupt nicht benutzt. Ich dachte, die ursprüngliche Frage würde lediglich darauf abzielen, die Collator-Instanz ständig wiederzuerlangen. – james