7

いずれかのフィールドのプロパティに従って並べ替える必要のあるオブジェクトのリストがあります。これを行うには、SortedMapとComparatorsが最良の方法だと聞きました。

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

編集: このコードは私にエラーを与えています:

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

(Ktrは実装しますComparator<Ktr>)。Eclipseは、のようなものを期待していると言っているTreeMap<K, V>ので、私が提供しているパラメーターの数が正しくありません。

4

5 に答える 5

9
  1. より簡単な方法はComparable、既存のオブジェクトを使用して実装することですが、代わりにを作成してComparatorに渡すこともできますSortedMap。とは2つの異なるものであることに
    注意してください。実装するクラスは別のオブジェクトと比較し、実装するクラスは他の2つのオブジェクトを比較します。ComparableComparatorComparablethisComparator
  2. を実装する場合Comparable、コンストラクターに特別なものを渡す必要はありません。だけお電話new TreeMap<MyObject>()ください。(編集:Mapsもちろん、1つではなく2つのジェネリックパラメーターが必要な場合を除きます。愚かな私です!)
    代わりに、を実装する別のクラスを作成Comparatorする場合は、そのクラスのインスタンスをコンストラクターに渡します。
  3. はい、TreeMapJavadocによると。

編集:質問を読み直すと、これは意味がありません。すでにリストがある場合は、実装Comparableしてから呼び出すのが賢明ですCollections.sort。地図は必要ありません。

小さなコード:

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

と同様に、SortedMap代わりにを作成してComparator<MyObject>に渡すことができますCollections.sort(List, Comparator)

于 2009-09-17T16:50:16.070 に答える
3

1.1。

それは状況によって異なります。セット内のオブジェクトBの前にオブジェクトAを並べ替える必要があるとします。一般に、AをB未満と見なすことが理にかなっている場合は、Comparableを実装することは理にかなっています。セットを使用するコンテキストでのみ順序が意味をなす場合は、おそらくコンパレータを作成する必要があります。

2.2。

new TreeMap(new MyComparator());

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

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

3.はい。

于 2009-09-17T16:53:32.677 に答える
2

リストがあり、マップ上に1つの引数があるためにエラーが発生するため、ソートされたセットが必要だと思います。

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

これにより、セットがソートされたままになります。つまり、イテレータは要素をソート順に返します。使用したいSortedSetに固有のメソッドもあります。逆方向にも移動したい場合は、NavigableSetを使用できます。

于 2009-09-17T17:58:39.590 に答える
1

私の答えは、のTreeMap実装を使用していることを前提としていますSortedMap

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

2.)例:

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

3.)はい、その通りです。内部的には、 TreeMapは赤黒木を使用して、要素が挿入された順に要素を格納します。挿入(または取得)を実行するための時間コストはO(log N)です。

于 2009-09-17T16:50:35.133 に答える
0

あなたはを作りますComparator<ClassYouWantToSort>。次に、コンパレータは、ソートするフィールドを比較します。

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

編集:アダムスキが指摘するように、あなたはClassYouWantToSort自分自身を作ることもできますComparable。利点は、処理するクラスが少なく、コードが単純で、ClassYouWantToSort便利なデフォルトの順序が付けられることです。欠点は、明確な順序が1つもない可能性があるため、とにかく他の状況に合わせClassYouWantToSortて実装する必要があることです。Comparablesまた、を変更できない場合がありますClassYouWantToSort

EDIT2:コレクションにスローするオブジェクトがたくさんあり、それがMap(つまり、あるオブジェクトのセットから別のセットへのマッピングではない)場合は、TreeSetではなく、が必要ですTreeMap

于 2009-09-17T16:50:44.063 に答える