我在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
。如何解决这个问题?
我甚至尝试按照你们的建议添加编辑,但仍然没有工作......
答案 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());
}
}
}