raccolta copia con l'uso di Iterator: Java
-
25-10-2019 - |
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.
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.