Java 多次迭代集合
我在使用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
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()
returnfalse
。我如何解决这个问题
我甚至试着按照你们的建议添加编辑,但仍然不起作用…你们在重复使用同一个迭代器-通过向集合中添加新项,这已经无效了 您应该在集合上再次调用
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请查看已编辑的示例,该示例显示使用副本获取具有原始项的迭代器。一旦找到答案,我们就不要将其放入问题中。我会撤销的。