Java:SortedMap、TreeMap、Comparable?使い方?
-
10-07-2019 - |
質問
フィールドの1つのプロパティに従ってソートする必要があるオブジェクトのリストがあります。これを行うには、SortedMapとComparatorsが最適な方法だと聞いたことがあります。
- ソートしているクラスとComparableを実装しますか、それとも新しいクラスを作成しますか?
- SortedMapをインスタンス化し、Comparatorに渡すにはどうすればよいですか
- ソートはどのように機能しますか?新しいオブジェクトが挿入されると、すべてが自動的にソートされますか?
編集: このコードは私にエラーを与えています:
private TreeMap<Ktr> collection = new TreeMap<Ktr>();
(KtrはComparator<Ktr>
を実装します)。 EclipseはTreeMap<K, V>
のようなものを期待していると言っているので、私が提供しているパラメーターの数は間違っています。
解決
- より簡単な方法は、既存のオブジェクトで
Comparable
を実装することですが、代わりにComparator
を作成してSortedMap
に渡すこともできます。
this
およびnew TreeMap<MyObject>()
は2つの異なるものです。Maps
を実装するクラスはTreeMap
を別のオブジェクトと比較し、Collections.sort
を実装するクラスは2つの other オブジェクトを比較します。 -
Comparator<MyObject>
を実装する場合、コンストラクタに特別なものを渡す必要はありません。Collections.sort(List, Comparator)
を呼び出すだけです。 (編集:もちろん、<=> 1つではなく2つの汎用パラメーターが必要であることを除きます。バカです!)
代わりに<=>を実装する別のクラスを作成する場合は、そのクラスのインスタンスをコンストラクターに渡します。 - はい、 <=> 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
のオブジェクトを挿入すると、Comparable
はComparables
を使用して適切にソートします。
編集:Adamskiが述べているように、Map
自体をTreeSet
にすることもできます。利点は、処理するクラスが少なくなり、コードが単純になり、<=>が便利なデフォルトの順序になることです。欠点は、<=>に明確な順序が1つもない場合があるため、とにかく他の状況では<=>を実装する必要があることです。また、<=>を変更できない場合があります。
EDIT2:コレクションにスローするオブジェクトの束のみがあり、それが<=>ではない場合(つまり、オブジェクトのセットから別のセットへのマッピングではない場合)、<=>が必要です。 、<=>ではありません。