Java LinkedHashSet 从末尾删除一些元素

标签 java linkedhashset

我正在解决一个问题,我需要存储具有无重复和维护顺序要求的元素。我选择使用 LinkedHashSet 因为它满足了我的两个要求。

假设我有以下代码:

 LinkedHashSet hs = new LinkedHashSet();
  hs.add("B");
  hs.add("A");
  hs.add("D");
  hs.add("E");
  hs.add("C");
  hs.add("F");
  if(hs.contains("D")){
       //do something to remove elements added after"D" i-e remove "E", "C" and "F"
       //maybe hs.removeAll(Collection<?>c) ??
   }

任何人都可以指导我删除这些元素的逻辑吗?

我使用了错误的数据结构吗?如果是这样,那么更好的选择是什么?

最佳答案

如果您使用 LinkedHashSet,我认为您可能需要使用迭代器来进行删除。也就是说找到该元素,然后不断移除,直到到达尾部。这将是 O(n),但即使您编写自己的 LinkedHashSet(带有双向链表和哈希集),您也可以访问原始链接结构,以便您可以在 O(1) 中剪切链表,但是您仍然需要从 HashSet 中删除刚刚从链表中删除的所有元素,这将再次产生 O(n) 成本。

总而言之,删除该元素,然后保留该元素的迭代器,并继续向下删除元素,直到到达末尾。我不确定 LinkedHashSet 是否公开了所需的调用,但您也许可以弄清楚。

关于Java LinkedHashSet 从末尾删除一些元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15890248/

相关文章:

java - 高效获取 LinkedHashSet 中最近插入的元素

java - 拒绝同线程可重入但允许异线程可重入的锁

java - 定时 Action 优化

java - JList - 检索项目

java - Android HashSet 无法转换为 LinkedHashSet

Java-比较 itr() 和 itr.next() 的 double 值

java - 在 Java 中从线程创建子线程

java - 如何使用 Google App Engine 邮件服务发送电子邮件?

java - 按日期时间对 LinkedHashset 进行排序

java - 为什么 LinkedHashMap keyset() 不返回 LinkedHashSet vs Set?