85

Comparable<> を使用して「自然な並べ替え順序」を定義するオブジェクトを取得しました。これらは TreeSets に格納されています。

オブジェクトを削除して再度追加する以外に、並べ替え順序を定義するために使用されるメンバーが更新されたときに並べ替えを更新する別の方法はありますか?

4

7 に答える 7

18

他の人が指摘したように、組み込みの方法はありません。ただし、選択したコンストラクターを使用してその 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()これには、データ オブジェクトに追加のメソッドを実装する必要があります。

于 2010-04-05T22:00:34.110 に答える
6

同様の問題があり、このスレッドと tucuxi の回答 (ありがとう!) を見つけ、それに基づいて独自のUpdateableTreeSet. 私のバージョンは、

  • そのようなセットを反復し、
  • ループ内からの (遅延) 要素の更新/削除のスケジュール
  • セットの一時コピーを作成する必要がなく、最終的に
  • ループが終了した後、すべての更新/削除を一括操作として実行します。

UpdateableTreeSet多くの複雑さをユーザーから隠します。延期された一括更新/削除に加えて、tucuxi で示されている単一要素の更新/削除は、引き続きクラスで使用できます。

2012 年 8 月 7 日更新: このクラスは小さなGitHub リポジトリで入手できます。これには、回路図のサンプル コードを含む入門的な README と、それを使用する (しない) 方法をより詳細に示す単体テストが含まれています。

于 2012-06-23T11:55:31.193 に答える
3

本当にを使用する必要がある場合はSet、運が悪いと思います。

ただし、ワイルドカードを使用します。状況が、のList代わりに使用できるほど柔軟な場合は、オンデマンドで再ソートするためにSet使用できます。順序をあまり変更する必要がない場合は、これはパフォーマンスが高いはずです。Collections.sort()ListList

于 2010-04-05T17:10:42.447 に答える
1

組み込みの方法は、削除して再度追加することだけです。

于 2010-04-05T17:05:12.423 に答える
1

オブジェクトが少しずつ変化するのか、それとも大きく変化するのかを知ることは役に立ちます。各変更が非常に小さい場合は、データを並べ替えたリストに入れると非常にうまくいくでしょう。これを行うには、する必要があります

  1. 要素のインデックスを見つけるバイナリ検索
  2. 要素を修正する
  3. 要素がその右隣よりも大きい間、その右隣と交換します
  4. または、それが起こらなかった場合: 要素が左側の隣接要素よりも小さい場合は、左側の隣接要素と交換します。

ただし、「あなた」を介さずに誰も要素を変更できないようにする必要があります。

編集:また!Glazed Lists はこれをサポートしています:

http://publicobject.com/glazedlists/glazedlists-1.5.0/api/ca/odell/glazedlists/ObservableElementList.html

于 2010-04-05T22:36:04.087 に答える
-1

すぐに使える方法はないと思います。

要素内の値を変更するたびにツリーセットに通知するオブザーバーパターンを使用して、要素を削除して再挿入することができます。

このようにして、手動で行うことを気にせずにリストを暗黙的にソートしたままにすることができます。もちろん、このアプローチはTreeSet、挿入の動作を変更することによって拡張する必要があります(追加されたばかりのアイテムに監視/通知メカニズムを設定します)

于 2010-04-05T17:04:21.270 に答える