7

私が達成したいのは、オブジェクトの集合を文字列値でソートすることです。ただし、コレーターを使用してロケールに依存する方法で。パフォーマンス上の理由から、Java APIはCollat​​ionKeyの使用がはるかに高速であると述べているため、Collat​​orKeyクラスではなくCollat​​or compare()メソッド(以下のコードのように)を使用したくありません。

しかし、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は、を使用して並べ替えるオブジェクトのタイプですCollationKeysTreeMap実装として使用できます
  2. 並べ替えるe要素ごとに、m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);

繰り返し処理するm.values()と、を使用して必要な文字列でソートされたオブジェクトが生成されますCollationKeys

これは効率的ではないと思いますが、うまくいくはずです。

于 2009-09-14T19:52:11.997 に答える
-2

PersonをComparableにする代わりに、Comparatorを使用します。コンパレータは2つのPersionインスタンスを取得し、いくつかのCollat​​orインスタンスに基づいてそれらを比較できます。その後、電話

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