Comparable<> を使用して「自然な並べ替え順序」を定義するオブジェクトを取得しました。これらは TreeSets に格納されています。
オブジェクトを削除して再度追加する以外に、並べ替え順序を定義するために使用されるメンバーが更新されたときに並べ替えを更新する別の方法はありますか?
Comparable<> を使用して「自然な並べ替え順序」を定義するオブジェクトを取得しました。これらは TreeSets に格納されています。
オブジェクトを削除して再度追加する以外に、並べ替え順序を定義するために使用されるメンバーが更新されたときに並べ替えを更新する別の方法はありますか?
他の人が指摘したように、組み込みの方法はありません。ただし、選択したコンストラクターを使用してその TreeSet をいつでもサブクラス化し、必要な機能を追加することができます。
public class UpdateableTreeSet<T extends Updateable> extends TreeSet<T> {
// definition of updateable
interface Updateable{ void update(Object value); }
// constructors here
...
// 'update' method; returns false if removal fails or duplicate after update
public boolean update(T e, Object value) {
if (remove(e)) {
e.update(value);
return add(e);
} else {
return false;
}
}
}
((UpdateableTreeSet)mySet).update(anElement, aValue)
それ以降は、ソート値とソート自体を更新するために呼び出す必要があります。update()
これには、データ オブジェクトに追加のメソッドを実装する必要があります。
同様の問題があり、このスレッドと tucuxi の回答 (ありがとう!) を見つけ、それに基づいて独自のUpdateableTreeSet
. 私のバージョンは、
UpdateableTreeSet
多くの複雑さをユーザーから隠します。延期された一括更新/削除に加えて、tucuxi で示されている単一要素の更新/削除は、引き続きクラスで使用できます。
2012 年 8 月 7 日更新: このクラスは小さなGitHub リポジトリで入手できます。これには、回路図のサンプル コードを含む入門的な README と、それを使用する (しない) 方法をより詳細に示す単体テストが含まれています。
本当にを使用する必要がある場合はSet
、運が悪いと思います。
ただし、ワイルドカードを使用します。状況が、のList
代わりに使用できるほど柔軟な場合は、オンデマンドで再ソートするためにSet
使用できます。順序をあまり変更する必要がない場合は、これはパフォーマンスが高いはずです。Collections.sort()
List
List
組み込みの方法は、削除して再度追加することだけです。
オブジェクトが少しずつ変化するのか、それとも大きく変化するのかを知ることは役に立ちます。各変更が非常に小さい場合は、データを並べ替えたリストに入れると非常にうまくいくでしょう。これを行うには、する必要があります
ただし、「あなた」を介さずに誰も要素を変更できないようにする必要があります。
編集:また!Glazed Lists はこれをサポートしています:
すぐに使える方法はないと思います。
要素内の値を変更するたびにツリーセットに通知するオブザーバーパターンを使用して、要素を削除して再挿入することができます。
このようにして、手動で行うことを気にせずにリストを暗黙的にソートしたままにすることができます。もちろん、このアプローチはTreeSet
、挿入の動作を変更することによって拡張する必要があります(追加されたばかりのアイテムに監視/通知メカニズムを設定します)