【发布时间】:2011-04-26 15:25:24
【问题描述】:
在某些情况下,我需要驱逐 Java Set 中最旧的元素。该集合是使用LinkedHashSet 实现的,这很简单:只需去掉集合迭代器返回的第一个元素即可:
Set<Foo> mySet = new LinkedHashSet<Foo>();
// do stuff...
if (mySet.size() >= MAX_SET_SIZE)
{
Iterator<Foo> iter = mySet.iterator();
iter.next();
iter.remove();
}
这很难看:如果我使用 SortedSet,我可以用 1 行代码完成 3 行(由于其他原因,SortedSet 不是这里的选项):
if (/*stuff*/)
{
mySet.remove(mySet.first());
}
那么有没有更简洁的方法来做到这一点,没有:
- 更改
Set实现,或 - 编写静态实用方法?
任何利用Guava 的解决方案都可以。
我完全知道集合没有内在的顺序。我问的是删除迭代顺序定义的第一个条目。
【问题讨论】:
-
您能评论一下为什么不能选择 SortedSet 吗?有了更多信息,有人可能会提供更好的解决方案。
-
为什么迭代器返回的第一个元素应该是最旧的?
-
@RHSeeger,排序集不是一个选项,因为它比较对象并按其自然顺序排序。对象不会跟踪它们在其他 Collection 对象中的插入顺序,因此无法覆盖或更改自然顺序以模仿插入顺序。
-
@RHSeeger:因为我可以添加 1000 个具有相同时间戳的元素(以毫秒为单位)。
-
Do you have a good reason for not implementing your own version of Set/OrderedSet, even if the code involved is small?是的……已经完成了;)