java - 从 Set 中移除 "first"对象

标签 java set guava

在某些情况下,我需要驱逐 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(出于其他原因,SortedSet 不是这里的选项):

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

那么有没有一种更简洁的方法来做到这一点,没有:

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

利用 Guava 的任何解决方案很好。


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

最佳答案

LinkedHashSet 是 LinkedHashMap 的包装器,它支持简单的“删除最旧”策略。要将它用作一个集合,你可以这样做

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

关于java - 从 Set 中移除 "first"对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5792596/

相关文章:

java - 为什么 T 在 Collections.max() 签名中受 Object 限制?

java - Google 自定义图像搜索 - 仅返回网站图像

c++ - std::set 和 std::map 有什么区别

python - 检查用户输入和具有多个值的字典键之间的匹配

java - HashBiMap 是线程安全的吗?

java - 漂亮地登录 jooq

java - 在 Windows Java SecureRandom.generateSeed 中失败 : Unexpected CryptoAPI failure

math - 确定性有限状态自动机问题

java - 如何从 Guava 的 List 中获取 max() 元素

java - 如何从列表中过滤元素