1

引数としてコレクションへのイテレータを持つメソッドがあります。メソッド内で、イテレータが「指している」コレクションをコピーしたい。ただし、コレクション コピーには最後のコレクション エントリのみが存在し、N 回 (N は元のコレクションのサイズ) 存在します。

public void someMethod(Iterator<Node> values) {
  Vector<Node> centralNodeNeighbourhood = new Vector<Node>();
  while (values.hasNext()) {
    Node tmp = values.next();
    centralNodeNeighbourhood.add(tmp);
  }
  ...
  //store the centralNodeNeighbourhood on disk
}

「オリジナルコレクション」の例:

1
2
3

例 "centralNodeNeighbourhood コレクション":

3
3
3

誰かが私の間違いを指摘できますか? メソッドの引数を変更することはできません。イテレータをコレクションに取得するだけで、それについては何もできません。

更新 (いくつかの質問への回答)

while (values.hasNext()) {
            Node tmp = values.next();
            System.out.print("Adding = "+tmp.toString());
            centralNodeNeighbourhood.add(tmp);
        }

適切なオリジナル コレクション要素を出力します。元のコレクションがどのタイプかはわかりませんが、Iterator は std java からのものです。その方法は、

public class GatherNodeNeighboursInfoReducer extends MapReduceBase
        implements Reducer<IntWritable, Node, NullWritable, NodeNeighbourhood>{
    public void reduce(IntWritable key, Iterator<Node> values,
                   OutputCollector<NullWritable, NodeNeighbourhood> output, Reporter reporter) throws IOException {...}
}

OLD Hadoop API のメソッド (Hadoop バージョン 0.20.203.0)

解決済み 各反復で tmp オブジェクトのコピーを作成し、このコピーを centralNodeNeighbourhood コレクションに追加します。これで私の問題は解決しました。すべての(迅速な)ヘルプに感謝します。

4

2 に答える 2

3

Iterator は毎回同じ Node オブジェクトを返しているようです。その場合は、ノードをコレクションに追加する前にノードのコピーを作成する必要があります。(そうしないと、毎回同じオブジェクトを追加することになり、最後に設定された値が保持されます)

于 2011-11-29T18:03:22.073 に答える
1

Hadoop のreduceメソッドは、反復子で値オブジェクトを再利用することを指定しています。それはひどいことですが、それはそれがすることです。

フレームワークは、reduce に渡されたキーと値のオブジェクトを再利用するため、アプリケーションは、コピーを保持したいオブジェクトを複製する必要があります。多くの場合、すべての値がゼロまたは 1 つの値に結合されます。

于 2011-11-29T18:43:07.923 に答える