从 Set 中删除“第一个”对象

2022-09-01 19:41:44

在某些情况下,我需要逐出Java中最古老的元素。该集合是使用LinkedHashSet实现的,这使得这很简单:只需摆脱集合的迭代器返回的第一个元素:Set

Set<Foo> mySet = new LinkedHashSet<Foo>();
// do stuff...
if (mySet.size() >= MAX_SET_SIZE)
{
    Iterator<Foo> iter = mySet.iterator();
    iter.next();
    iter.remove();
}

这很丑陋:如果我使用a,则可以使用3行来做一些我可以用1行做的事情(出于其他原因,a在这里不是一个选项):SortedSetSortedSet

if (/*stuff*/)
{
    mySet.remove(mySet.first());
}

那么有没有一种更简洁的方法可以做到这一点,而无需:

  • 更改实现,或Set
  • 编写静态实用程序方法?

任何利用番石榴的解决方案都很好。


我完全知道集合没有固有的排序。我询问的是删除迭代顺序定义的第一个条目。


答案 1

LinkedHashSet是LinkedHashMap的包装器,它支持简单的“删除最旧”策略。要将其用作集合,您可以执行

Set<String> set = Collections.newSetFromMap(new LinkedHashMap<String, Boolean>(){
    protected boolean removeEldestEntry(Map.Entry<String, Boolean> eldest) {
        return size() > MAX_ENTRIES;
    }
});

答案 2
if (!mySet.isEmpty())
  mySet.remove(mySet.iterator.next());

似乎少于3行。

当然,如果你的集合由多个线程共享,你必须围绕它进行同步。


推荐