修剪有序集

时间:2010-11-28 13:33:19

标签: java collections trim treeset sortedset

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

  • 已排序:更新需要按日期排序,降序。
  • 设置:从更新源获取最新更新时,我通常会收到设置中已有的更新。

现在,经过一段时间后,这个集合会变得非常庞大,所以我想删除除了集合中的前X个项目之外的所有内容(因为其他内容无论如何都不会显示)。我怎么能这样做,因为它不是List

5 个答案:

答案 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
}