修剪已排序的集合
我有一个包含更新的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
接受的答案并不是真正有效的O(ln n),因为它使用了删除函数。
这是一个更好的方法,因为
pollLast()
的时间复杂度为 O(1),大小为 O(1)。复杂性只会受到修剪尺寸的影响。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.这里的解决方案应该取决于您将来是否需要“额外”数据。如果您需要基于附加列表的解决方案也可以。如果没有,我建议如下:
创建您自己的排序集,扩展 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.
我自己的解决方法是:
My own workaround is:
下面是 Java 的一个可行的解决方案方法,给定一个 TreeSet results 和一个指定结果集大小的变量 size:
Here's a working solution method for Java, given a TreeSet results, and a variable size specifying the size of the resulting set: