2009-09-14 4 views
7

То, что я хотел бы достичь, - это сортировать коллекцию объектов по строковому значению. Однако в зависимости от языка с использованием коллатора. Из-за причин производительности я не хочу использовать метод Collator compare() (как показано ниже в коде), а не класс CollationKey, так как API Java утверждает, что использование CollationKey выполняется намного быстрее.Java: Сортировка коллекции с помощью CollatorKey

Но как реализовать метод compareTo() с помощью CollationKey? Насколько я понял, я должен полностью написать все методы сравнения самостоятельно, если я буду использовать CollationKey. Поэтому я даже больше не буду использовать методы Collections.sort() ... Я очень благодарен за простой и понятный пример, а также самую эффективную реализацию для сортировки объектов Collection of Person с помощью CollationKey.

Спасибо!

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

ответ

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

Здравствуйте, Эриксон, большое спасибо за умное решение, я его реализую так, спасибо! – jan

0
  1. Создать SortedMap м, где T является тип объектов, которые вы хотите отсортировать с помощью CollationKeys. Вы можете использовать TreeMap как реализация
  2. Для каждого электронного элемента, который вы хотите отсортировать, m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);

Перебор m.values() должны давать свои объекты, отсортированные по строке, которую вы хотите использовать CollationKeys.

Я считаю, что это не эффективно, но оно должно работать.

+0

Эриксон приводит к более эффективному решению. – alex

+0

В моем случае принятое решение не может быть реализовано, и это отлично работает. –

-2

использовать компаратор вместо создания сопоставимого лица. ваш компаратор может взять 2 экземпляра Persion и сравнить их на основе некоторого экземпляра Collator. затем вызвать ответ

Collections.sort(list, myPersonComparator); 
+0

Проблема заключается в хранении collationKey в компараторе, так что он не рассчитывается повторно ... – alex

+0

ах, я вижу проблему. Я вообще не использовал Collators. Я думал, что первоначальный вопрос заключался в том, чтобы просто постоянно требовать повторение экземпляра Collator. – james

Смежные вопросы