2010-11-28 10 views
2

SortedSet(具体的にはTreeSet)に更新が含まれています。ソートセットのトリミング

  • ソート:更新は降順、日付でソートする必要がある更新は、SVNコミット、Facebookのウォールポスト、新しいTracのチケットなど私はSortedSetためにこれらを格納していますのようなものです。
  • 設定:更新元から最新の更新を取得するとき、通常は既にセットに含まれている更新を受け取ります。

今、しばらくすると、セットが本当に巨大になるので、セットから最初のXアイテムを削除したいと思います(他のアイテムは表示されないため)。 Listではないので、どうすればいいですか?

答えて

4
While(mySet.size() > limit) { 
    mySet.remove(mySet.last()); 
} 
+0

を私はそれのパフォーマンスについて知らない比較私の回避策には、それは本当に問題ではありません。これは非常に読みやすいです –

+0

これは原子的には行いません。私は似たようなことが必要ですが、原子的に完了しました – Wins

0

私自身の問題を回避するには、次のとおりです。ここ

 List<Update> trimmed = new ArrayList<Update>(20); 
     int i = 0; 
     for (Update u : updates) { 
      trimmed.add(u); 
      i++; 
      if (i > 20) break; 
     } 
     updates = new TreeSet<Update>(trimmed); 
1

ソリューションは、あなたが将来的には「余分な」データが必要かどうかという事実に依存する必要があります。追加のリストに基づいてソリューションが必要な場合はOKです。

java.util.SortedSetを拡張して独自のソートセットを作成し、そのadd()メソッドをオーバーライドします。このメソッドは、ある制限の後で何もしないでください。代わりに、ペイロードセットを保持し、add()を除くすべてのメソッドを委譲する「ラッパー」Setを作成することもできます。 add()メソッドは、ペイロードセットのサイズが定義済みの制限よりも小さい場合にのみ、その呼び出しを委譲する必要があります。 これはジャカルタコレクションフレームワークのFixedSizeSortedMapがどのように動作するかを示しています。ここで

+0

事は、私は何もしたくないということです。新しいアイテムが追加され、古いアイテムは削除されます。 –

0

は、Javaのための実用的なソリューションの方法ですが、TreeSetの結果、および結果セットのサイズを指定する変数サイズ与えられた:

void setLimit(Set<T> resutls, int size) { 
    List<T> items = new ArrayList<T>(); 
    items.addAll(resutls); 
    resutls.clear(); 
    int trim = size>items.size() ? items.size() : size; 
    resutls.addAll(items.subList(0,trim)); 
    // return results; // optionally, if required 
} 
関連する問題