Джава:Сортировка коллекции с помощью CollatorKey
-
07-07-2019 - |
Вопрос
чего я хотел бы добиться, так это отсортировать коллекцию объектов по строковому значению.Однако в зависимости от локали используется механизм сортировки.Из соображений производительности я не хочу использовать метод сравнения() Collator (как показано ниже в коде), а скорее класс 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);
...
Решение
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);
}
}
Другие советы
- Создайте SortedMap m, где T — тип объектов, которые вы хотите отсортировать, используя
CollationKeys
.Вы можете использоватьTreeMap
как реализация - Для каждого элемента e, который вы хотите отсортировать,
m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);
Итерация m.values()
должен давать ваши объекты, отсортированные по строке, которую вы хотите использовать CollationKeys
.
Я считаю, что это неэффективно, но должно работать.
используйте Comparator вместо того, чтобы делать Person Comparable. ваш Comparator может взять 2 экземпляра Person и сравнить их на основе некоторого экземпляра Collator. затем позвоните
Collections.sort(list, myPersonComparator);