Джава:Сортировка коллекции с помощью CollatorKey

StackOverflow https://stackoverflow.com/questions/1423501

  •  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);
  }

}

Другие советы

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

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

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

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

Collections.sort(list, myPersonComparator);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top