当前位置: 首页 > 知识库问答 >
问题:

为什么迭代器在被调用两次时不会上升?

索嘉石
2023-03-14

下面的程序迭代一个字符串。迭代器将其在空格之间剪切,并返回每个单词。我使用for each循环来使用iterable字符串,在该循环中,我使用与外部循环中相同的迭代器对同一字符串再次迭代。输出是:hello 0 hello 2等。。。

但它应该是:你好0你好2。。。因为外部循环已经增加了迭代器的计数器。所以我想我在这张图片中遗漏了一些关于迭代器工作的东西。。。感谢您的帮助!

代码:

import java.util.Iterator;

public class TopLevelClass{

    public TopLevelClass(final String... strings) {
        for(String nextSentence : strings){
            IterableSentence itSentence = new IterableSentence(nextSentence);
            for(String nextWord : itSentence){
                for(String nextWord2 : itSentence){
                    System.out.println(nextWord + " " + nextWord2);
                }
            }
        }
    }

    public static void main(String... args){
        final TopLevelClass sceneData = new TopLevelClass("hello 0 2");
    }

    private class IterableSentence implements Iterable<String>{

        private final String sentence;

        private IterableSentence(String sentence){
            this.sentence = cleanup(sentence);
        }

        private IterableSentence(IterableSentence itSentence){
            this.sentence = itSentence.sentence;
        }

        @Override public Iterator<String> iterator(){
            return new SentenceIterator();
        }

        private class SentenceIterator implements Iterator<String>{

            private final String[] words = sentence.split(" ");
            private int counter = 0;

            @Override public boolean hasNext(){
                return counter < words.length;
            }

            @Override public String next(){
                //System.out.println("called");
                return words[counter++].replaceAll("\\s+","");
            }
        }

    }
}

共有1个答案

印成天
2023-03-14

for循环调用IterableSentence上的iterator(),因此最终得到两个独立的迭代器

如果我理解你真正想要做的事情,那么迭代器就不是你想要的方式,最简单的方法就是使用嵌套循环。

 类似资料:
  • 问题内容: 我正在使用带有ItemListener的JComboBox。更改值后,itemStateChanged事件将被调用两次。第一次调用,ItemEvent显示所选的原始项目。第二次显示正在由用户选择的项目。这是一些测试器代码: 因此,当我将组合框从“一个”更改为“三个”时,控制台显示: 我有没有办法告诉我使用ItemEvent,它是第二个项目(即用户选择的项目)?如果有人可以解释为什么两次

  • 我读在初始渲染时只被调用一次,但我看到它被渲染了多次。 似乎我创建了一个递归循环。 组件didMount调度动作来获取数据 一旦接收到数据,它就会触发成功操作,将数据存储在redux状态。 父反应组件连接到redux存储,并且具有mapStateToProps用于刚刚在上述步骤中更改的条目 父渲染子组件(通过变量编程选择) 子组件的组件didMount再次被调用 它消除了获取数据的操作 我想这就是

  • 编辑:由于代码剪贴不会重现错误-这里有一个指向github repo的链接:(代码远未完成) https://github.com/altruios/clicker-game 我现在已经在两台计算机上运行了它——这两台计算机都有相同的行为,而代码剪报并没有显示出来。 因此,我正在构建一个clicker游戏来学习react,我不明白为什么这段代码会以这种方式运行: 在主应用程序中,我有以下功能: 那

  • 问题内容: 我的活动课在这里: 和相机预览类在这里: 但是,当我测试该类时,似乎首先调用onResume(),然后在1或2秒后再次调用。因此,相机必须再次刷新。如果我根本没有onResume(),则摄像头预览稳定,但是如果我从主屏幕或其他某个应用再次切换到该应用,则会崩溃。我发现onPause()不会影响任何一个。我的代码正确吗?我应该添加/删除哪些内容以使其不会再次刷新并且在应用切换后仍然不会崩

  • 问题内容: 代码很简单: 您会看到这里有一个函数,我们只在体内调用它一次。但是在控制台中,它打印两次: 您可以在此处观看现场演示:http : //plnkr.co/edit/tb8RpnBJZaJ73V73QISC?p=preview 为什么该函数已被调用两次? 问题答案: 在AngularJS中,用大括号括起来的任何东西都是一个在摘要循环 中至少 被求值 一次 的表达式。 __ Angular

  • 问题内容: 我有一个想法,可能是因为我正在做一些样式设计来更改单选按钮,但是我不确定。我正在设置一个onClick事件,该事件两次调用了我的函数。我已删除它以确保它没有在其他地方被触发,并且onClick似乎是罪魁祸首。 我的功能目前仅是运输选项的简单控制台日志: 如果没有任何理由可以在这里看到为什么会发生这种情况,我可以发布其余代码,但是有很多方面,我认为这与之无关,但是我认为这是一个很好的起点