2009-09-14 2 views
7

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

しかし、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); 
... 

答えて

13
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

こんにちはエリクソン、スマートなソリューションをありがとう、私はこのような、感謝を実装する! – jan

0
  1. Tは、あなたがCollationKeysを使用してソートするオブジェクトの種類であるのSortedMap mを、作成します。あなたはCollationKeysを使用したい文字列でソートし、m.values()の繰り返し処理m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);

は、あなたのオブジェクトを生成する必要があり、ソートしたい各電子要素についてTreeMap

  • 実装として使用することができます。

    私はこれが効率的ではないと信じていますが、うまくいくはずです。

    +0

    エリクソンの答えは、より効率的なソリューションにつながる呼び出します。 – alex

    +0

    私の場合、受け入れられた解決策は実装できませんでしたが、これは完全に機能しました。 –

    -2

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

    Collections.sort(list, myPersonComparator); 
    
    +0

    問題は、Comparatorにcollat​​ionKeyを保存して、繰り返し計算されないようにすることです... – alex

    +0

    ああ、問題があります。私はCollat​​orをまったく使用していません。元の質問は、Collat​​orインスタンスの再取得を継続的に取り組むことに過ぎないと思いました。 – james

    関連する問題