【问题标题】:Trimming a sorted set修剪排序集
【发布时间】:2010-11-28 13:33:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: java collections trim treeset sortedset


    【解决方案1】:
    While(mySet.size() > limit) {
      mySet.remove(mySet.last());
    }
    

    【讨论】:

    • 与我的解决方法相比,我不知道它的性能,但这并不重要。这非常容易阅读
    • 这不是原子操作。我需要类似的东西,但原子完成
    【解决方案2】:

    在效率不高的O(ln n)中被接受的答案,因为它使用了删除功能。 这是一个更好的,因为pollLast()O(1) 并且大小是 O(1)。复杂性只会受修剪后的大小影响。

    While(mySet.size() > limit) {
      mySet.pollLast();
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 问题是,我不想添加什么也不做。将添加新项目,并删除旧项目。
      【解决方案4】:

      我自己的解决方法是:

              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);
      

      【讨论】:

        【解决方案5】:

        这是一个适用于 Java 的有效解决方法,给定一个 TreeSet results,以及一个指定结果集大小的变量 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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-10
          • 1970-01-01
          • 1970-01-01
          • 2019-02-01
          相关资源
          最近更新 更多