TreeSetは、同じComprator値を持つさまざまなアイテムを削除します。削除したくない。これを制御する方法はありますか?または、別のコンテナクラスを使用しますか?
追加:OK。セットが使えないようです。パフォーマンスを考慮して、挿入ソート機能が必要です。リストはこれを行うことができますか?皆さんありがとう。
TreeSetは、同じComprator値を持つさまざまなアイテムを削除します。削除したくない。これを制御する方法はありますか?または、別のコンテナクラスを使用しますか?
追加:OK。セットが使えないようです。パフォーマンスを考慮して、挿入ソート機能が必要です。リストはこれを行うことができますか?皆さんありがとう。
定義によるセットは、重複するエントリを持つことはできません。
したがって、リストや配列などを使用する必要があります
セットであっても、オブジェクトが異なるため、混乱を招きます。たとえば、Set<E>
異なるオブジェクトのaは、使用に基づいてE
に変換されると、いくつかのオブジェクトをドロップします。どちらの場合もセットですが、格納される要素のセットは異なります。私の意見では、これはドキュメントでは十分に明確にされていません。TreeSet<E>
Comparator<E>
簡単な解決策は、コンパレータを変更できる場合は、0を返さないようにすることです。たとえば、次の代わりに:
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
使用する:
public int compare(Integer o1, Integer o2) {
return o1 < o2 ? -1: 1;
}
aの主な目的は、重複Set
しないようにすることです。が必要ないかSet
、別のが必要ですComparator
。
SortedListが必要な場合は、たとえばリストを取得し、挿入するたびに手動でCollections.sort()を呼び出すことができます。
または、たとえばArrayListをラップして、sort-callを確実に実行します。
class SortedArrayList extends ArrayList<String> {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void add(int index, String element) {
super.add(index, element);
Collections.sort(this);
}
@Override
public boolean add(String element) {
boolean returnValue = super.add(element);
Collections.sort(this);
return returnValue;
}
@Override
public boolean addAll(Collection<? extends String> c) {
boolean returnValue = super.addAll(c);
Collections.sort(this);
return returnValue;
}
@Override
public boolean addAll(int index, Collection<? extends String> c) {
boolean returnValue = super.addAll(index, c);
Collections.sort(this);
return returnValue;
}
@Override
public String set(int index, String element) {
String returnValue = super.set(index, element);
Collections.sort(this);
return returnValue;
}
}
ソートが必要な関数がすべて揃っているといいのですが。(オーバーライドするために削除する必要はありません)