Java: сортировка коллекции с использованием CollatorKey - PullRequest
7 голосов
/ 14 сентября 2009

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

Но как мне реализовать метод 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);
...

Ответы [ 3 ]

13 голосов
/ 15 сентября 2009
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 голосов
/ 14 сентября 2009

используйте Comparator вместо того, чтобы делать Person Comparable. ваш компаратор может взять 2 экземпляра Persion и сравнить их на основе некоторого экземпляра Collator. затем позвоните

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

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

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

...