修剪已排序的集合

发布于 2024-10-05 13:23:24 字数 323 浏览 6 评论 0原文

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

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

现在,过了一段时间,集合将变得非常巨大,所以我想从集合中删除除前 X 个项目之外的所有内容(因为其他项目无论如何都不会显示)。由于它不是 List,我该如何执行此操作?

I have a SortedSet (specifically a TreeSet) containing updates. An update is something like an SVN commit, Facebook wall post, new Trac ticket, etc. I'm storing these in a SortedSet because:

  • Sorted: The updates need to be sorted by date, descending.
  • Set: When fetching the latest updates from an update source, I'll usually receive updates that are already in the set.

Now, after a while the set will grow really huge, so I'd like to remove anything but the first X items from the set (because others won't be displayed anyway). How can I do this, since it's not a List?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

东京女 2024-10-12 13:23:24
While(mySet.size() > limit) {
  mySet.remove(mySet.last());
}
While(mySet.size() > limit) {
  mySet.remove(mySet.last());
}
浮云落日 2024-10-12 13:23:24

接受的答案并不是真正有效的O(ln n),因为它使用了删除函数。
这是一个更好的方法,因为 pollLast() 的时间复杂度为 O(1),大​​小为 O(1)。复杂性只会受到修剪尺寸的影响。

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

The accepted answer in not really efficient O(ln n) because it uses remove function.
Here is a better one since pollLast() is O(1) and size is O(1). Complexity will be only affected by trimmed size.

While(mySet.size() > limit) {
  mySet.pollLast();
}
八巷 2024-10-12 13:23:24

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

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

The solution here should depend on the fact whether you need the "extra" data in future. If you need your solution based on additional list is ok. If not, I'd suggest the following:

Create your own sorted set that extends the java.util.SortedSet and overrides its add() method. This method should do nothing after certain limit. Alternatively you can create "wrapper" Set that holds payload set and delegates all methods except add(). The add() method should delegate its call only if size of payload set is less than the predefined limit.
This is how FixedSizeSortedMap of jakarta collection framework works, so you can just use it.

黑色毁心梦 2024-10-12 13:23:24

我自己的解决方法是:

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

My own workaround is:

        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);
红ご颜醉 2024-10-12 13:23:24

下面是 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
}

Here's a working solution method for Java, given a TreeSet results, and a variable size specifying the size of the resulting set:

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
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文