Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Java迭代器_Java_Loops_Iteration - Fatal编程技术网

理解Java迭代器

理解Java迭代器,java,loops,iteration,Java,Loops,Iteration,如果我运行下面的代码,它将打印出3次重复,但是当我删除while循环中的If语句时(只是为了看看它将迭代多少次),它将启动一个无限循环 这个hasNext()方法实际上是如何工作的?我认为这只会重复5次,因为我在列表中有5项 public class ExerciseOne { public static void main(String []args){ String []colors = {"MAGENTA","RED","WHITE","BLUE","CYA

如果我运行下面的代码,它将打印出3次重复,但是当我删除while循环中的If语句时(只是为了看看它将迭代多少次),它将启动一个无限循环

这个
hasNext()
方法实际上是如何工作的?我认为这只会重复5次,因为我在列表中有5项

    public class ExerciseOne {
    public static void main(String []args){
        String []colors = {"MAGENTA","RED","WHITE","BLUE","CYAN"};
        List<String> list = new ArrayList<String>();
        for(String color : colors)
            list.add(color);
        String[] removeColors = {"RED","WHITE","BLUE"};
        List<String> removeList = new ArrayList<String>();
        for(String color : removeColors)
            removeList.add(color);

        removeColors(list,removeList);
        System.out.printf("%n%nArrayList after calling removeColors:%n");
        for(String color : list)
        {
            System.out.printf("%s ",color);
        }
    }

    private static void removeColors(Collection<String> collection1, Collection<String> collection2)
    {
        Iterator<String> iterator = collection1.iterator();

            while(iterator.hasNext()){
                if(collection2.contains(iterator.next()))
                    System.out.println("duplicate");
            }
    }

}
公共课练习一{
公共静态void main(字符串[]args){
字符串[]颜色={“洋红”、“红色”、“白色”、“蓝色”、“青色”};
列表=新的ArrayList();
用于(字符串颜色:颜色)
列表。添加(颜色);
字符串[]RemoveColor={“红色”、“白色”、“蓝色”};
List removeList=new ArrayList();
用于(字符串颜色:RemoveColor)
移除列表。添加(颜色);
RemoveColor(列表,removeList);
System.out.printf(“%n%n调用RemoveColor后的数组列表:%n”);
用于(字符串颜色:列表)
{
System.out.printf(“%s”,颜色);
}
}
专用静态void removeColors(集合集合1、集合集合2)
{
迭代器迭代器=collection1.Iterator();
while(iterator.hasNext()){
if(collection2.contains(iterator.next()))
系统输出打印项次(“副本”);
}
}
}

事实上,这很简单

while(iterator.hasNext()){
    if(collection2.contains(iterator.next()))
       System.out.println("duplicate");
}
假设迭代器是指向列表元素的指针

当您调用
next()
时,您将此指针向前移动一步

如果不移动指针,
hasNext()
将始终为true,因为您仍在列表的开头

    public class ExerciseOne {
    public static void main(String []args){
        String []colors = {"MAGENTA","RED","WHITE","BLUE","CYAN"};
        List<String> list = new ArrayList<String>();
        for(String color : colors)
            list.add(color);
        String[] removeColors = {"RED","WHITE","BLUE"};
        List<String> removeList = new ArrayList<String>();
        for(String color : removeColors)
            removeList.add(color);

        removeColors(list,removeList);
        System.out.printf("%n%nArrayList after calling removeColors:%n");
        for(String color : list)
        {
            System.out.printf("%s ",color);
        }
    }

    private static void removeColors(Collection<String> collection1, Collection<String> collection2)
    {
        Iterator<String> iterator = collection1.iterator();

            while(iterator.hasNext()){
                if(collection2.contains(iterator.next()))
                    System.out.println("duplicate");
            }
    }

}

因此,您必须调用迭代器的
next()
,直到列表中没有任何剩余元素。

如果删除If语句,那么它将进入无限循环,因为您的
迭代器。next()
处于If状态。实际上,
iterator.next()
是移动指针的api,而不是
hasNext()
hasNext()
只需检查集合中是否有任何元素。由于删除if语句也会删除
hasNext
api,因此指向集合的指针不会移动,
hasNext
始终返回true

    public class ExerciseOne {
    public static void main(String []args){
        String []colors = {"MAGENTA","RED","WHITE","BLUE","CYAN"};
        List<String> list = new ArrayList<String>();
        for(String color : colors)
            list.add(color);
        String[] removeColors = {"RED","WHITE","BLUE"};
        List<String> removeList = new ArrayList<String>();
        for(String color : removeColors)
            removeList.add(color);

        removeColors(list,removeList);
        System.out.printf("%n%nArrayList after calling removeColors:%n");
        for(String color : list)
        {
            System.out.printf("%s ",color);
        }
    }

    private static void removeColors(Collection<String> collection1, Collection<String> collection2)
    {
        Iterator<String> iterator = collection1.iterator();

            while(iterator.hasNext()){
                if(collection2.contains(iterator.next()))
                    System.out.println("duplicate");
            }
    }

}
如果从If条件中取出
迭代器.next()
,并将其移动到If条件之上,则即使删除If语句,循环仍将迭代5次

Iterator<String> iterator = collection1.iterator();
while(iterator.hasNext()){
      String currentColor = iterator.next();
      if(collection2.contains(currentColor)){
         System.out.println("duplicate");
      }
}
Iterator Iterator=collection1.Iterator();
while(iterator.hasNext()){
字符串currentColor=iterator.next();
if(collection2.contains(currentColor)){
系统输出打印项次(“副本”);
}
}
为什么迭代器很重要/引入迭代器的问题很简单:
考虑下面的例子:
列表=新的ArrayList();
列表。添加(“Anurag”);
列表。添加(“Soni”);
列表。添加(“MMM”);
列表。添加(“GKP”);
用于(字符串s:列表){
如果(s.equals(“Anurag”)
s、 删除();
系统输出打印项次;
}
当您试图在迭代完成之前更改数据结构列表的结构时,这将抛出一个异常——“并发修改异常”。
因此,您可以出于同样的目的使用迭代器。
迭代器迭代器=List.Iterator();
while(iterator.hasNext()){
字符串current=iterator.next();
如果(当前==“Anurag”){
iterator.remove();
}否则{
系统输出打印项次(当前);
}
}
输出:Soni
嗯
吉凯恩

您读过文档了吗?
hasNext
不移动迭代器光标,
iterator.next()
移动它,所以当您删除条件时,您实际删除的光标会更改为yes,当然,“如果迭代包含更多元素,则返回true”,但我无法理解当它到达列表的末尾时,为什么它会继续循环,我将尝试查找其他一些教程或文档,因为oracles’中的一个对于@leo its的mecheck答案不太清楚correct@imoteb,它不会到达列表的末尾。如果删除
If
条件,则永远不会移动迭代器向前看,它只是永远停留在列表的开头。谢谢你,现在我明白了it@leo你说它像一个指针(“想象”)。但是,它是一个指针吗?谢谢Erick指出这一点。这是我有史以来的第一个答案。我根据你的评论编辑了我的答案,尽管它在另一个答案中得到了正确的解释。非常感谢@Erick。