首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我找不到迭代器的值?

为什么我找不到迭代器的值?
EN

Stack Overflow用户
提问于 2021-02-14 04:31:59
回答 3查看 73关注 0票数 0

为什么这段代码不打印包含"q"的值?

代码语言:javascript
复制
Iterator<String> it = ZoneId.getAvailableZoneIds().iterator();

while (it.hasNext()) {
    if (it.next().contains("q"))
         System.out.println(it.next());
}

输出:

代码语言:javascript
复制
Pacific/Kwajalein
Etc/GMT-3
America/Martinique
Pacific/Funafuti
Canada/Pacific
Eire
America/Sitka
Brazil/West
US/Aleutian
EN

回答 3

Stack Overflow用户

发布于 2021-02-14 04:36:54

每次调用next()都会读取下一项,但在打印时会再次调用next(),所以打印的下一项中包含一个q

Java为这种情况提供了一种方便的语法;foreach循环

代码语言:javascript
复制
for (String zoneId : ZoneId.getAvailableZoneIds()) {
     if (zoneId.contains("q")) {
        System.out.println(zoneId);
     }
}

或者最近,streams:

代码语言:javascript
复制
ZoneId.getAvailableZoneIds().stream()
  .filter(zoneId -> zoneId.contains("q"))
  .forEach(System.out::println);
票数 5
EN

Stack Overflow用户

发布于 2021-02-14 04:34:13

因为您遍历了其中包含'q'的条目。第一个it.next()移动迭代器并返回对象。然后在if中再次移动迭代器,打印包含'q'的元素后一个元素。

票数 4
EN

Stack Overflow用户

发布于 2021-02-14 04:45:18

这是因为您调用next()两次。每次执行此操作时,都会从Iterator中读取下一个值。看看这个:

代码语言:javascript
复制
Iterator<String> it = ZoneId.getAvailableZoneIds().iterator();

while (it.hasNext()) {
    String zoneId = it.next();

    if (zoneId.contains("q"))
        System.out.println(zoneId);
}

您可以使用更具可读性的语法对for loop执行同样的操作

代码语言:javascript
复制
for (String zoneId : ZoneId.getAvailableZoneIds())
    if (zoneId.contains("q"))
        System.out.println(zoneId);

或者,可能使用Stream

代码语言:javascript
复制
ZoneId.getAvailableZoneIds().stream()
      .filter(zoneId -> zoneId.contains("q"))
      .forEach(System.out::println);    

所有代码片段的结果都是相同的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66189617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档