2009-09-14 12 views
7

, co chciałbym osiągnąć, to sortować kolekcję obiektów według wartości łańcuchowej. Jednak w sposób zależny od ustawień lokalnych za pomocą kolektora. Ze względu na wydajność nie chcę używać metody CollaterKey porównywania (jak poniżej w kodzie) raczej z klasą CollationKey, ponieważ API java stwierdza, że ​​użycie CollationKey jest znacznie szybsze.Java: Sortuj kolekcję za pomocą przycisku CollatorKey

Ale jak zaimplementować metodę compareTo() za pomocą klucza CollationKey? O ile to zrozumiałem, muszę całkowicie napisać wszystkie metody porównania, jeśli będę używał klucza CollationKey. Tak więc nie będę już mógł używać metod Collections.sort() ... Jestem bardzo wdzięczny za przykład, który jest łatwy do zrozumienia i najskuteczniejszą implementację do sortowania obiektów Collection of Person przy użyciu CollationKey.

Dziękujemy!

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

Odpowiedz

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

Witaj, Erickson, bardzo dziękuję za inteligentne rozwiązanie, zaimplementuję to tak, dzięki! – jan

0
  1. Tworzenie SortedMap m, gdzie T jest typem obiektów, które chcesz posortować używając CollationKeys. Można użyć TreeMap jak wdrożenie
  2. Dla każdego elementu E, który chcesz uporządkować, m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);

iteracji nad m.values() powinna przynieść swoje obiekty, posortowane według napisu, który chcesz używając CollationKeys.

Uważam, że nie jest to skuteczne, ale powinno działać.

+0

Ericksona prowadzi do bardziej efektywnego rozwiązania. – alex

+0

W moim przypadku zaakceptowane rozwiązanie nie mogło zostać wdrożone i ten działał idealnie. –

-2

użyj komparatora zamiast porównywać osobę. Komparator może pobrać 2 instancje i porównać je na podstawie instancji Collator. następnie wywołać odpowiedź

Collections.sort(list, myPersonComparator); 
+0

Problem polega na przechowywaniu klucza sortowania w komparatorze, aby nie był on obliczany wielokrotnie ... – alex

+0

ah, widzę problem. w ogóle nie używałem Collatorów. Myślałem, że pierwotne pytanie dotyczyło jedynie ciągłego ponownego pobierania instancji Collator. – james

Powiązane problemy