循环不起作用 - 只有第一个元素重复

The loop doesn't work - only the first element repeats

提问人:Sped 提问时间:11/9/2023 最后编辑:ChaosfireSped 更新时间:11/9/2023 访问量:72

问:

下面是重现该问题的代码

var list = new ArrayList<String>();
list.add("Omni");
list.add("Okan");
var iter = list.iterator();
for (var item = iter.next(); iter.hasNext(); iter.next()) {
    System.out.println(item);
}

我尝试了这段代码,而不是.我也尝试了不同的元素集,但遇到了同样的问题 - 第一个元素重复了几次Omni OmniOnmi Okanlist.size()

Java 循环

评论

0赞 Rifat Rubayatul Islam 11/9/2023
您忘记更新 .您也在致电后进行检查itemhasNext()next()
0赞 user2342558 11/9/2023
这不是 Java,而是 JavaScript。我更新了标签
0赞 Chaosfire 11/9/2023
@user2342558这是 java,自版本 10 以来一直是有效的关键字。var
0赞 user2342558 11/9/2023
@Chaosfire我明白了,所以从 v 10 开始,它允许使用通过定义的表达式之一自动设置类型?var
0赞 Chaosfire 11/9/2023
@user2342558 如果我没记错的话,这个功能叫做局部变量类型推断。基本上,编译器在编译过程中会找出正确的类型。

答:

0赞 Oleg Cherednik 11/9/2023 #1

你不直接地使用循环。最好改用循环。forwhile

List<String> items = List.of("Omni", "Okan");
Iterator<String> it = items.iterator();

while (it.hasNext()) {
    String item = it.next();
    System.out.println(item);
}
3赞 Pateman 11/9/2023 #2

这将起作用:

var list = new ArrayList<String>();
list.add("Omni");
list.add("Okan");
for (var it = list.iterator(); it.hasNext(); ) {
    var item = it.next();
    System.out.println(item);
}

然而,这并不是对读者最友好的方式。还有其他选择(奥列格已经提出了一个。请看下面的一些例子: 在 Java 中遍历列表的方法

最直接的方法是增强的 for 循环,如下所示:

var list = new ArrayList<String>();
list.add("Omni");
list.add("Okan");
for (var elem : list) {
    System.out.println(elem);
}

评论

0赞 user2342558 11/9/2023
注意:那不是 Java,而是 JavaScript。(顺便说一句,它们非常相似,并且都具有增强的 for 循环)
0赞 Pateman 11/9/2023
这确实是 Java。较新的版本允许使用关键字。var
0赞 user2342558 11/9/2023
哦,我明白了,从 v 10 开始,谢谢
0赞 Ishan 11/9/2023 #3

而不是

        for (var item = iter.next(); iter.hasNext(); iter.next()) {
            System.out.println(item);
        }

您可以使用以下选项,但仍然不是最佳选项:

        for (; iter.hasNext();) {
            System.out.println(iter.next());
        }

最好的选择是使用这样的 while 循环:

        while (iter.hasNext()) {
            System.out.println(iter.next());
        }

问题出在你的for循环中。

这是for循环的结构

for(initialization; exit condition; update variables)

在您的例子中,您用作初始值设定项,这意味着 已使用第一个值进行初始化。 打印该值后,作为部件,您做了 ,这将返回下一个值。但你从来没有存储过它。var item = iter.next()itemupdate variablesiter.next()

之后,它将检查退出条件。由于已提取第二个值,因此将返回 false,因此 for 循环将退出。因此,在您的例子中,只打印了一个值。第二个值只是没有存储在任何变量中。您可以作为更新部分完成,但仍然会更新,但由于条件将在更新变量后返回 false,因此它不会仍然打印。update variablesiter.hasNext()item = iter.next()itemiter.hasNext()