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

时间:2014-08-21 10:04:30

标签: java iterator set hashset

我有一个场景,我正在使用迭代器迭代一个集合。现在我想删除第一个元素,而我的迭代器在第二个元素上。我该怎么做。我知道Set是无序的,没有像第一个或第二个元素的东西,但我的问题是我想要删除Iterator.next当前没有返回的元素

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

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

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

  4. 示例代码。

    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
            }
    

3 个答案:

答案 0 :(得分:0)

HashSet是无序的,javadoc明确指出迭代器删除方法 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根据广告订单为您提供有序的订单

答案 1 :(得分:0)

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);

答案 2 :(得分:0)

考虑到你所说的限制因素,我不认为这个问题有解决办法。

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

您建议的三种方法(但随后被排除在外)都可行。我认为第二个将是最高效的。

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