1

我可以一次又一次地使用可迭代遍历列表吗?当我使用 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可以,但参数不能?感谢您阅读这么多。

4

2 回答 2

3

一般来说,这不是 Iterable 的问题,但可能是框架传递给该方法的特定实现类的问题。如果您考虑一下,当您调用 next(); 时,该类可能正在通过网络拉取 Iterable 的每个元素;这可以解释为什么你不能再次运行它。如果您确实需要这样做,那么保存每个元素是一个很好的解决方案。

于 2011-03-16T12:28:08.623 回答
0

我认为这个问题与迭代器是一种单向、一次性的集合有关。从谷歌收藏常见问题解答:

Iterator 代表一种单向可滚动的元素“流”,而 Iterable 是任何可以产生独立迭代器的东西。Collection 远不止于此,因此我们仅在需要时才需要它。1

于 2011-03-16T12:31:02.153 回答