Domanda

Ho un metodo che ha come argomento un iteratore alla raccolta. All'interno del metodo voglio copiare la collezione l'iteratore è "che punta a". Tuttavia solo l'ultima voce collezione è presente nella copia di raccolta, è presente volte N, dove N è la dimensione della collezione originale.

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
}

Exemplar "collezione originale":

1
2
3

Exemplar "collezione centralNodeNeighbourhood":

3
3
3

Qualcuno mi può punto a mio errore? Non posso cambiare le args metodo, ho solo l'Iterator alla raccolta, non si può fare nulla al riguardo.

UPDATE (Risposta ad alcune domande)

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

Consente di stampare elementi propri collezione originale. Non so che tipo è la collezione originale, ma l'Iterator è da Java std. Il metodo è il

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 {...}
}

metodo dal OLD Hadoop api (Hadoop versione 0.20.203.0)

RISOLTO Feci una copia dell'oggetto tmp ad ogni iterazione, e aggiungo questa copia alla raccolta centralNodeNeighbourhood. Ciò ha risolto il mio problema. Thx per tutto il vostro (veloce) di aiuto.

È stato utile?

Soluzione

La sua sembra che l'Iterator viene restituita l'oggetto stesso nodo di volta in volta. Se è così, è necessario prendere una copia del nodo prima di aggiungerlo alla collezione. (In caso contrario, vi sarà l'aggiunta di uno stesso oggetto ogni volta e avrà gli ultimi valori è stato impostato su)

Altri suggerimenti

Hadoop di ridurre specifica metodo che riutilizza il valore oggetti nel suo iteratore. Questa è una cosa terribile da fare, ma questo è ciò che fa.

Il quadro sarà riutilizzare gli oggetti chiave e valori che sono passati nel ridurre, quindi, l'applicazione dovrebbe clonare gli oggetti che vogliono mantenere una copia di. In molti casi, tutti i valori sono combinati in zero o un valore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top