4

我有一个SortedSet(特别是 a TreeSet)包含更新。更新类似于 SVN 提交、Facebook 墙贴、新 Trac 票等。我将这些存储在 a 中是SortedSet因为:

  • 排序:更新需要按日期降序排序。
  • 集合:从更新源获取最新更新时,我通常会收到集合中已经存在的更新。

现在,过了一段时间,这个集合会变得非常大,所以我想从集合中删除除前 X 个项目之外的任何东西(因为无论如何其他项目都不会显示)。我该怎么做,因为它不是List?

4

5 回答 5

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

接受的答案不是真正有效的O(ln n),因为它使用了删除功能。这是一个更好的,因为pollLast()O(1)并且大小是O(1)。复杂性将仅受修剪大小的影响。

While(mySet.size() > limit) {
  mySet.pollLast();
}
于 2018-10-23T20:21:09.307 回答
1

这里的解决方案应该取决于您将来是否需要“额外”数据。如果您需要基于附加列表的解决方案是可以的。如果没有,我建议如下:

创建您自己的排序集,扩展 java.util.SortedSet 并覆盖其 add() 方法。这种方法在一定限度后应该什么都不做。或者,您可以创建包含有效负载集并委托除 add() 之外的所有方法的“包装器”集。仅当有效负载集的大小小于预定义的限制时,add() 方法才应委托其调用。这就是jakarta集合框架的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

这是 Java 的一种可行的解决方法,给定一个 TreeSet results和一个指定结果集大小的可变大小

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 回答