我有SortedSet
(特别是TreeSet
)包含更新。更新类似于SVN提交,Facebook墙贴,新的Trac票证等。我将这些存储在SortedSet
中,因为:
现在,经过一段时间后,这个集合会变得非常庞大,所以我想删除除了集合中的前X个项目之外的所有内容(因为其他内容无论如何都不会显示)。我怎么能这样做,因为它不是List
?
答案 0 :(得分:5)
While(mySet.size() > limit) {
mySet.remove(mySet.last());
}
答案 1 :(得分:1)
这里的解决方案应该取决于您将来是否需要“额外”数据。如果你需要你的解决方案基于额外的列表是好的。如果没有,我建议如下:
创建自己的有序集,扩展java.util.SortedSet并覆盖其add()方法。一定限制后,此方法无效。或者,您可以创建包含有效负载集的“包装器”集,并委托除add()之外的所有方法。仅当有效负载集的大小小于预定义的限制时,add()方法才应委托其调用。 这就是jakarta集合框架FixedSizeSortedMap的工作原理,所以你可以使用它。
答案 2 :(得分:1)
在不是很有效的 O(ln n)中接受的答案,因为它使用了删除功能。
这是一个更好的选择,因为pollLast()
是 O(1),大小是 O(1)。复杂度只会受尺寸调整的影响。
While(mySet.size() > limit) {
mySet.pollLast();
}
答案 3 :(得分: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);
答案 4 :(得分:0)
这是一个适用于Java的工作解决方案方法,给定TreeSet 结果,以及一个变量 size ,指定结果集的大小:
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
}