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は反復可能である必要があるだけですが、なぜArrayListはできますが、パラメーターはできませんか?たくさん読んでくれてありがとう。

4

2 に答える 2

3

これは一般的にIterableの問題ではありませんが、フレームワークによってそのメソッドに渡される特定の実装クラスの問題である可能性があります。あなたがそれについて考えるならば、あなたがnext()を呼び出すとき、そのクラスはおそらくネットワーク上でIterableの各要素を引っ張っています。それはあなたがそれをもう一度ひっくり返すことができない理由を説明するでしょう。それが本当にあなたがしなければならないことであるならば、各要素を保存することは良い解決策です。

于 2011-03-16T12:28:08.623 に答える
0

問題は、イテレータが一方向の1回限りの種類のコレクションであることに関係していると思います。google-collectionsのよくある質問から:

イテレータは、要素の一方向にスクロール可能な「ストリーム」を表し、イテレータは、独立したイテレータを生成できるものです。コレクションはこれよりはるかに多いので、必要なときにだけ必要です。1

于 2011-03-16T12:31:02.153 に答える