繁体   English   中英

如何使用Iterator从集合中删除元素?

[英]How to remove an element from set using Iterator?

我有一种情况,我正在使用迭代器遍历集合。 现在,我想在迭代器位于第二个元素上时删除第一个元素。 我该怎么做。 我知道Set是无序的,没有像第一个或第二个元素一样的东西,但是我的问题是我想删除Iterator.next当前未返回的元素

  1. 我不想将此设置转换为列表并使用listIterator。

  2. 我不想收集所有要在其他集合中删除的对象,并调用全部删除

  3. 迭代后我无法存储并删除

示例代码。

Set<MyObject> mySet = new HashSet<MyObject>();

mySet.add(MyObject1);
mySet.add(MyObject2);

...
Iterator itr = mySet.iterator();
        while(itr.hasNext())
        {
            // Now iterator is at second element and I want to remove first element
        }

HashSet是无序的,并且javadoc明确声明Iterator的remove方法Removes from the underlying collection the last element returned by this iterator (optional operation). 因为HashSet包含唯一元素,所以您可以在遍历第一个元素后使用Set.remove(Object),在thios情况下,您甚至不需要转到第二个元素

HashSet<K> hs;// you HashSet containing unique elements

if(!hs.isEmpty())
{
  hs.remove(hs.iterator().next());
}

Just remember HashSet is unordered and there is no such thing as 1st or 2nd element

或者,您应该使用LinkedHashSet ,它根据插入顺序为您提供有序的Set

Set.iterator()返回一个java.lang.Iterator 此迭代器仅提供删除当前元素并向前迭代的方法。

因此,如果您不想转换集合,则仅使用Iterator不能删除上一个元素。

例如,您可以做的是收集要删除的元素,然后遍历整个集合,然后例如使用Set.removeAll(removableCollection)删除收集的元素:

List<MyObject> removableList = new ArrayList<>();

MyObject previous;

Iterator<MyObject> itr = mySet.iterator();
while (itr.hasNext()) {
    MyObject current = itr.next();

    // If you find you want to remove the previous element:
    if (someCondition)
        removableList.add(previous);

    previous = current;
}

mySet.removeAll(removeableList);

考虑到您所说的限制,我认为没有解决问题的办法。

  • Iterator.remove()方法将仅删除“当前”元素。
  • 您已排除“记住”对象,并在第二遍/阶段将其从HashSet中删除。
  • 涉及同时使用两个迭代器并使用其中一个迭代器进行删除的方案将导致第二个迭代器出现CCME。

您建议(但随后排除)的三种方法都可以使用。 我认为第二名将是表现最好的。

另一个想法是实现一个新的基于哈希表的Set类型,该类型具有一个带有额外删除操作的Iterator (您可以从HashSet等的源代码开始,重命名该类,然后对其进行修改以执行您需要的操作。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM