我有一个SortedSet
(特别是 a TreeSet
)包含更新。更新类似于 SVN 提交、Facebook 墙贴、新 Trac 票等。我将这些存储在 a 中是SortedSet
因为:
- 排序:更新需要按日期降序排序。
- 集合:从更新源获取最新更新时,我通常会收到集合中已经存在的更新。
现在,过了一段时间,这个集合会变得非常大,所以我想从集合中删除除前 X 个项目之外的任何东西(因为无论如何其他项目都不会显示)。我该怎么做,因为它不是List
?
我有一个SortedSet
(特别是 a TreeSet
)包含更新。更新类似于 SVN 提交、Facebook 墙贴、新 Trac 票等。我将这些存储在 a 中是SortedSet
因为:
现在,过了一段时间,这个集合会变得非常大,所以我想从集合中删除除前 X 个项目之外的任何东西(因为无论如何其他项目都不会显示)。我该怎么做,因为它不是List
?
While(mySet.size() > limit) {
mySet.remove(mySet.last());
}
接受的答案不是真正有效的O(ln n),因为它使用了删除功能。这是一个更好的,因为pollLast()
是O(1)并且大小是O(1)。复杂性将仅受修剪大小的影响。
While(mySet.size() > limit) {
mySet.pollLast();
}
这里的解决方案应该取决于您将来是否需要“额外”数据。如果您需要基于附加列表的解决方案是可以的。如果没有,我建议如下:
创建您自己的排序集,扩展 java.util.SortedSet 并覆盖其 add() 方法。这种方法在一定限度后应该什么都不做。或者,您可以创建包含有效负载集并委托除 add() 之外的所有方法的“包装器”集。仅当有效负载集的大小小于预定义的限制时,add() 方法才应委托其调用。这就是jakarta集合框架的FixedSizeSortedMap的工作原理,所以你可以使用它。
我自己的解决方法是:
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);
这是 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
}