4

アップデートを含むSortedSet(具体的にはTreeSet) があります。更新とは、SVN コミット、Facebook ウォール投稿、新しい Trac チケットなどのようなものです。これらを次のSortedSet理由で保存しています。

  • 並べ替え: 更新は、日付の降順で並べ替える必要があります。
  • セット: 更新元から最新の更新を取得するとき、通常、既にセットに含まれている更新を受け取ります。

さて、しばらくするとセットが非常に大きくなるので、セットから最初の X アイテム以外はすべて削除したいと思います (他のアイテムはとにかく表示されないため)。ではないので、どうすればこれを行うことができListますか?

4

5 に答える 5

5
While(mySet.size() > limit) {
  mySet.remove(mySet.last());
}
于 2010-11-28T13:36:36.553 に答える
1

ここでの解決策は、将来「追加の」データが必要かどうかによって異なります。追加のリストに基づいてソリューションが必要な場合は問題ありません。そうでない場合は、次のことをお勧めします。

java.util.SortedSet を拡張し、その add() メソッドをオーバーライドする独自のソート済みセットを作成します。このメソッドは、一定の制限を超えると何もしません。または、ペイロード セットを保持し、add() 以外のすべてのメソッドを委譲する「ラッパー」セットを作成することもできます。add() メソッドは、ペイロード セットのサイズが事前定義された制限よりも小さい場合にのみ、その呼び出しを委任する必要があります。ジャカルタ コレクション フレームワークのFixedSizeSortedMapはこのように動作するので、そのまま使用できます。

于 2010-11-28T13:51:05.007 に答える
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);
于 2010-11-28T13:35:49.160 に答える
0

TreeSet resultsと、結果セットのサイズを指定する変数sizeが与えられた場合の Java の実用的なソリューション メソッドを次に示します。

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
}
于 2016-10-19T15:47:47.883 に答える