2009-09-17 22 views
4

フィールドのプロパティに従ってソートする必要があるオブジェクトのリストがあります。 SortedMapとComparatorsがこれを行う最も良い方法だと聞きました。Java:SortedMap、TreeMap、Comparable?使い方?

  1. ソートしているクラスでComparableを実装していますか、または新しいクラスを作成しますか?
  2. SortedMapをインスタンス化してコンパレータを渡すにはどうすればよいですか?
  3. ソートはどのように機能しますか?新しいオブジェクトが挿入されると自動的にすべてがソートされますか?

EDIT:

private TreeMap<Ktr> collection = new TreeMap<Ktr>(); 

(KTRがComparator<Ktr>を実装): このコードは私にエラーを与えています。 EclipseはTreeMap<K, V>のようなものを期待しているので、私が提供しているパラメータの数は間違っています。

+1

TreeSetは必要ですが、TreeMapは必要ありません。 – jprete

答えて

7
  1. 簡単な方法は、あなたの代わりにComparatorを作成し、SortedMapにそれを渡すことができますが、既存のオブジェクトとComparableを実装することです。
    ComparableComparatorは2つの異なることに注意してください。 Comparableを実装するクラスはthisを別のオブジェクトと比較し、Comparatorを実装するクラスは2つの他のオブジェクトを比較します。
  2. Comparableを実装する場合は、コンストラクタに特別なものを渡す必要はありません。ちょうどnew TreeMap<MyObject>()に電話してください。 (編集:Mapsには2つの一般的なパラメータが必要ですが、1つではありません)
    Comparatorを実装する別のクラスを作成する場合は、そのクラスのインスタンスをコンストラクタに渡します。
  3. はい、TreeMap Javadocsに従います。

編集:再読み込み質問に、これのどれも意味がありません。すでにリストがある場合は、Comparableを実装してCollections.sortを呼び出してください。地図は必要ありません。

少しコード:SortedMapと同様に

public class MyObject implements Comparable<MyObject> { 
    // ... your existing code here ... 
    @Override 
    public int compareTo(MyObject other) { 
     // do smart things here 
    } 
} 

// Elsewhere: 
List<MyObject> list = ...; 
Collections.sort(list); 

、あなたの代わりにComparator<MyObject>を作成し、Collections.sort(List, Comparator)にそれを渡すことができます。

+0

あなたは何を意味するか分かりますか?私はソートされているクラスではなくリストとComparableを実装しますか? –

0

私の回答は、SortedMapTreeMapの実装を使用していることを前提としています。

1.)TreeMapを使用する場合は、選択肢があります。クラスに直接Comparableを実装するか、別のComparatorをコンストラクタに渡すことができます。

2。)例:

Comparator<A> cmp = new MyComparator(); 
Map<A,B> map = new TreeMap<A,B>(myComparator); 

3)正しいです。内部的にはTreeMapは赤黒のツリーを使用して、要素を挿入する順に格納します。挿入(または検索)を実行するための時間コストはO(log N)です。

0

Comparator<ClassYouWantToSort>を作成します。その後、ソートするフィールドがComparatorによって比較されます。

TreeMapを作成するときは、TreeMap<ClassYouWantToSort>を作成し、Comparatorを引数として渡します。次に、タイプClassYouWantToSortのオブジェクトを挿入すると、TreeMapComparatorを使用して正しく並べ替えます。

EDIT:Adamskiが指摘したように、ClassYouWantToSort自体をComparableにすることもできます。利点は、対処するクラスが少なく、コードが簡単で、ClassYouWantToSortが便利なデフォルトの順序付けを取得することです。不利な点は、ClassYouWantToSortには明らかな順序がないことがあるため、とにかくComparablesを実装する必要があることです。 ClassYouWantToSortも変更できない場合があります。

EDIT2:あなたがコレクションに投げ込んでいるオブジェクトがたくさんあり、それがMapではない場合(つまり、オブジェクトのセットから別のセットへのマッピングではない場合)、TreeSetTreeMap

2

これは状況によって異なります。たとえば、オブジェクトAがオブジェクトBの前にソートされているとします。一般的にBより小さいAを考えることが理にかなっている場合、Comparableを実装することは理にかなっています。注文が、あなたがセットを使用するコンテキストでのみ意味がある場合は、おそらくコンパレータを作成する必要があります。

2.

new TreeMap(new MyComparator()); 

またはMyComparatorクラスを作成せず:

new TreeMap(new Comparator<MyClass>() { 
    int compare(MyClass o1, MyClass o2) { ... } 
}); 

3.はい。

1

あなたは、リストを持っていて、私はあなたがソートセットたいとマップ上の一つの引数持っているので、エラーが発生しますので:

SortedSet<Ktr> set = new TreeSet<Ktr>(comparator); 

このソートセット、すなわちを維持するの要素を返しますイテレータソート順に並べ替えます。また、使用したいかもしれないSortedSetに特有の方法もあります。あなたも後方に行きたい場合は、NavigableSetを使うことができます。

関連する問題