質問

フィールドの1つのプロパティに従ってソートする必要があるオブジェクトのリストがあります。これを行うには、SortedMapとComparatorsが最適な方法だと聞いたことがあります。

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

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

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

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

役に立ちましたか?

解決

  1. より簡単な方法は、既存のオブジェクトでComparableを実装することですが、代わりにComparatorを作成してSortedMapに渡すこともできます。
    this および new TreeMap<MyObject>() は2つの異なるものです。 Mapsを実装するクラスはTreeMapを別のオブジェクトと比較し、Collections.sortを実装するクラスは2つの other オブジェクトを比較します。
  2. Comparator<MyObject>を実装する場合、コンストラクタに特別なものを渡す必要はありません。 Collections.sort(List, Comparator)を呼び出すだけです。 (編集:もちろん、<=> 1つではなく2つの汎用パラメーターが必要であることを除きます。バカです!)
    代わりに<=>を実装する別のクラスを作成する場合は、そのクラスのインスタンスをコンストラクターに渡します。
  3. はい、 <=> Javadocs

編集:質問を読み直しても、これは意味がありません。既にリストがある場合、行うべき賢明なことは、<=>を実装してから <=> マップは必要ありません。

小さなコード:

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

<=>と同様に、代わりに<=>を作成して <=>

他のヒント

1。

それは状況によって異なります。セット内のオブジェクトBの前にオブジェクトAがソートされるとします。 AをBよりも小さいと考えるのが一般的に理にかなっている場合、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

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

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

2。)例:

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

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

Comparator<ClassYouWantToSort>を作成します。次に、Comparatorは並べ替えるフィールドを比較します。

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

編集:Adamskiが述べているように、Map自体をTreeSetにすることもできます。利点は、処理するクラスが少なくなり、コードが単純になり、<=>が便利なデフォルトの順序になることです。欠点は、<=>に明確な順序が1つもない場合があるため、とにかく他の状況では<=>を実装する必要があることです。また、<=>を変更できない場合があります。

EDIT2:コレクションにスローするオブジェクトの束のみがあり、それが<=>ではない場合(つまり、オブジェクトのセットから別のセットへのマッピングではない場合)、<=>が必要です。 、<=>ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top