7

我想要实现的是按字符串值对对象集合进行排序。但是,以依赖于语言环境的方式使用整理器。由于性能原因,我不想使用 Collat​​or compare() 方法(如下面的代码)而不是 Collat​​ionKey 类,因为 java API 声明使用 Collat​​ionKey 要快得多。

但是如何使用 Collat​​ionKey 实现 compareTo() 方法?据我了解,如果我要使用 Collat​​ionKey,我必须自己完全编写所有比较方法。所以我什至不能再使用 Collections.sort() 方法......我非常感谢一个易于理解的示例以及使用 Collat​​ionKey 对 Person 对象的集合进行排序的最有效实现。

谢谢!

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

3 回答 3

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

}
于 2009-09-14T20:04:59.543 回答
0
  1. 创建一个 SortedMap m,其中 T 是您要使用排序的对象的类型CollationKeys。您可以TreeMap用作实现
  2. 对于要排序的每个 e 元素,m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);

迭代m.values()应该产生你的对象,按你想要使用的字符串排序CollationKeys

我相信这不是有效的,但它应该有效。

于 2009-09-14T19:52:11.997 回答
-2

使用 Comparator 而不是使 Person Comparable。您的 Comparator 可以采用 2 个 Persion 实例并根据一些 Collat​​or 实例比较它们。然后打电话

Collections.sort(list, myPersonComparator);
于 2009-09-14T19:57:12.320 回答