Java 多次迭代集合

Java 多次迭代集合,java,collections,Java,Collections,我在使用java时遇到问题 it=myHash.iterator(); while (it.hasNext()) if (it.next() satisfying something) do something while (it.hasNext()) if (it.next() satisfying something) it.remove(); 我试图迭代hashset两次,第一个循环生成it.h

我在使用java时遇到问题

it=myHash.iterator();
 while (it.hasNext()) 
        if (it.next() satisfying something) 
            do something

 while (it.hasNext()) 
        if (it.next() satisfying something) 
            it.remove();
我试图迭代hashset两次,第一个循环生成
it.hasNext()
return
false
。我如何解决这个问题


我甚至试着按照你们的建议添加编辑,但仍然不起作用…

你们在重复使用同一个迭代器-通过向集合中添加新项,这已经无效了

您应该在集合上再次调用
iterator()

it = set.iterator();
无法重置现有迭代器

编辑:以下是一些示例代码,显示了此工作模式:

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Set<String> set = new HashSet<String>();

        set.add("food");
        set.add("bad");
        set.add("hungry");
        set.add("neighbour");

        Iterator<String> it = set.iterator();

        // Remove any string longer than 4
        while (it.hasNext())
        {
            if (it.next().length() > 4)
            {
                it.remove();
            }
        }

        set.add("new long text");
        set.add("x");

        // Remove any string shorter than 4
        it = set.iterator();

        while (it.hasNext())
        {
            if (it.next().length() < 4)
            {
                it.remove();
            }
        }

        // Dump the results
        for (String x : set)
        {
            System.out.println(x);
        }
    }
}
import java.util.*;
公开课考试{
公共静态void main(字符串[]args){
Set=newhashset();
设置。添加(“食品”);
设置。添加(“坏”);
设置。添加(“饥饿”);
设置。添加(“邻居”);
Iterator it=set.Iterator();
//删除任何长度超过4的字符串
while(it.hasNext())
{
if(it.next().length()>4)
{
it.remove();
}
}
添加(“新的长文本”);
设置。添加(“x”);
//删除任何短于4的字符串
it=set.iterator();
while(it.hasNext())
{
if(it.next().length()<4)
{
it.remove();
}
}
//转储结果
用于(字符串x:set)
{
系统输出println(x);
}
}
}

这将给出“新的长文本”和“食物”的结果。理想情况下,您需要的是迭代器上的重置操作。迭代器是单向和一次性使用的,因此它们在Java中不支持重置

您可以获得一个新的迭代器实例,也可以使用允许您使用previous()向后查看的接口

编辑:

您正在迭代器上使用remove(),迭代器也将从原始集合中删除元素。在这种情况下,您应该考虑制作一个集合的副本,因为您需要遍历所有元素:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;

public class IteratorSnippet {
   public static void main(String[] args) {

      final HashSet<Integer> myHash = new HashSet<Integer>();
      myHash.addAll(Arrays.asList(1, 2, 3, 4, 5));

      // make copy before using iterator with remove
      final HashSet<Integer> myHash2 = new HashSet<Integer>(myHash);

      Iterator<Integer> it = myHash.iterator();
      System.out.println("First go...");
      while (it.hasNext()) {
         System.out.println(it.next());
         it.remove();
      }

      it = myHash2.iterator();
      System.out.println("Second go...");
      while (it.hasNext()) {
         System.out.println(it.next());
      }

   }
}
导入java.util.array;
导入java.util.HashSet;
导入java.util.Iterator;
公共类迭代器{
公共静态void main(字符串[]args){
final HashSet myHash=新HashSet();
addAll(Arrays.asList(1,2,3,4,5));
//在使用带删除的迭代器之前进行复制
final HashSet myHash2=新HashSet(myHash);
迭代器it=myHash.Iterator();
System.out.println(“第一步…”);
while(it.hasNext()){
System.out.println(it.next());
it.remove();
}
it=myHash2.iterator();
System.out.println(“第二步…”);
while(it.hasNext()){
System.out.println(it.next());
}
}
}

@OfekRon:那就好了。请再次编辑,但这次用一个简短但完整的程序演示问题。我也会这样做,演示它是否有效。可能是因为我的电视机在,而你的电视机在?你认为这可能会引起麻烦吗?@OfekRon:可能吧,但是如果没有任何真正的示例代码,就不可能知道你在做什么。如果你的myHash最初是空的,迭代器也是空的,hasNext()将返回false。它不是空的。我可以告诉你,如果使用迭代器删除,那么条目也会从原始集合中删除。您应该考虑制作集合的副本,因为您想对原始项进行迭代。@OfekRon请查看已编辑的示例,该示例显示使用副本获取具有原始项的迭代器。一旦找到答案,我们就不要将其放入问题中。我会撤销的。