我可以在“foreach”中一次又一次地使用iterable遍历列表吗?

时间:2011-03-16 12:23:30

标签: java iterable

我可以一次又一次地使用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可以,但参数不能? 非常感谢你的阅读。

2 个答案:

答案 0 :(得分:3)

这通常不是Iterable的问题,但也许是框架传递给该方法的特定实现类的问题。如果你考虑一下,当你调用next()时,那个类可能正在通过网络拉出Iterable的每个元素;这可以解释为什么你不能再重复一次。如果这真的是你需要做的事情,保存每个元素是一个很好的解决方案。

答案 1 :(得分:0)

我认为这个问题与迭代器是单向的,一次性的集合有关。来自google-collections faq:

  

Iterator代表单向   可滚动的“流”元素,和   Iterable是可以的任何东西   产生独立的迭代器。一个   收集远不止于此   这个,所以我们只需要它   需要。1