我可以一次又一次地使用iterable遍历列表吗? 当我使用ArrayList时,我可以在“foreach”中反复遍历列表,但是当我在hadoop(一个分布式计算框架)中使用iterable作为参数时,只有第一次我可以遍历iterable,当我再次使用foreach,它会变得无用。 例如:
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
float all=0;
String resultKey;
float resultValue;
ArrayList<String> valuelist=new ArrayList<String>();
for (Text text : values) {
valuelist.add(text.toString());
}
for (String text : valuelist) {
String[] contents=text.toString().split(" ");
if(contents.length==1)
{
all=Float.parseFloat(contents[0]);
break;
}
}
if(all==0)
{
return;
}
for (String text : valuelist) {
String[] contents=text.toString().split(" ");
if(contents.length>1)
{
resultKey=contents[0]+" "+key.toString();
resultValue=Float.parseFloat(contents[1])/all;
context.write(new Text(resultKey), new Text(resultValue+""));
}
}
}
-----我必须先将它保存在ArrayList中...... 在我的理解中,foreach只需要一个iterable,为什么ArrayList可以,但参数不能? 非常感谢你的阅读。
答案 0 :(得分:3)
这通常不是Iterable的问题,但也许是框架传递给该方法的特定实现类的问题。如果你考虑一下,当你调用next()时,那个类可能正在通过网络拉出Iterable的每个元素;这可以解释为什么你不能再重复一次。如果这真的是你需要做的事情,保存每个元素是一个很好的解决方案。
答案 1 :(得分:0)
我认为这个问题与迭代器是单向的,一次性的集合有关。来自google-collections faq:
Iterator代表单向 可滚动的“流”元素,和 Iterable是可以的任何东西 产生独立的迭代器。一个 收集远不止于此 这个,所以我们只需要它 需要。1