不止一次迭代一个集合

时间:2011-12-13 05:21:58

标签: java collections

我在java中使用Iterator时遇到问题。

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()返回false。如何解决这个问题?

我甚至尝试按照你们的建议添加编辑,但仍然没有工作......

2 个答案:

答案 0 :(得分:3)

您正在重复使用相同的迭代器 - 并且通过向集合添加新项目而使其无效。

您应该再次致电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);
        }
    }
}

这给出了结果“新长文”和“食物”。

答案 1 :(得分:1)

理想情况下,您正在寻找的是迭代器上的重置操作。迭代器意味着单向和一次性使用,因此它们不支持Java中的重置。

你可以获得一个新的Iterator实例,也可以使用ListIterator界面,它允许你使用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());
      }

   }
}