【问题标题】:Weird behaviour of Java iteratorsJava 迭代器的奇怪行为
【发布时间】:2016-04-22 05:46:12
【问题描述】:

我在使用 Java 迭代器时遇到了一个奇怪的问题。

在某个函数中,接收一个名为filelist 的可迭代对象,然后我执行以下操作:

System.out.println("First iteration:");
for(Text t : filelist) System.out.println(t);
System.out.println("Second iteration:");
for(Text t : filelist) System.out.println(t);

输出是:

First iteration:

file2.txt

file1.txt

file1.txt

Second iteration:

filelist 的类型为 Iterable<Text>。我正在使用 Hadoop map/reduce 框架。

所以我的问题是,为什么在第二个循环中文件列表是空的,而我没有在第一个循环中更改它?

【问题讨论】:

  • filelist的类型是什么?
  • 可迭代。我正在使用 hadoop map/reduce 框架。
  • 这段代码在reducer类中使用,所以由于我使用hadoop框架,我假设每个reducer接收一个List对象。对吗?
  • List也是一个接口。添加System.out.println(filelist.getClass().getName());,并告诉你得到了什么。也就是说,无论是什么类型,除非底层数据结构被同时修改,否则永远不会发生这种情况。
  • 请不要在您的问题中添加答案。如果下面的答案解决了您的问题,您应该接受它。

标签: java iterator iterable


【解决方案1】:

Iterable 可能会返回可能不可重复的iterator。它的界面中没有任何内容说它不能。因此,在您的情况下,Iterable 似乎是由库作者设计的,只能使用一次。如果要进行第二次迭代,则需要将值存储在自己的结构中。 IE。你可以先做

List<Text> myList = new ArrayList(filelist)

【讨论】:

  • 您的意思是 Iterable,而不是 Iterator。迭代器永远不可重复。 Iterable 文档确实没有提及任何内容,但我从未见过任何只能迭代一次的 Iterable。它应该是 Iterator 或 Stream 而不是 Iterable。
  • 仍然 Iterable 只是返回迭代器。因此,我的意思是,该接口不会强制 Iterable 让每次调用 iterator() 返回新的就绪实例。仅可迭代 allows an object to be the target of the "foreach" statement
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
相关资源
最近更新 更多