PDA

View Full Version : [java] iterazione su ArrayList


Miky Mouse
24-06-2010, 09:46
ciao a tutti,

ho un problema ad iterare su un ArrayList di Double... (semplificando la cosa) se faccio:

for(int x=0; x<vettoreDiVettori.size(); x++){
System.out.println("indice: "+ x);
System.out.println("elemento: "+ vettoreDiVettori.get(x) );
}

questo mi ritorna l'output giusto (ma credo che sia concettualmente sbagliato iterare così, giusto?).

il problema è che gli elementi all'interno del vettore non sono unici, per cui con una cosa del tipo:

for(ArrayList<Double> x : vettoreDiVettori){
System.out.println("indice: "+vettoreDiVettori.indexOf(x));
System.out.println("elemento: "+ vettoreDiVettori.get(x) );
}

ottengo un output sbagliato (perché la get mi torna sempre il PRIMO indice del numero che gli passo come argomento, e non quello che mi servirebbe...)

come si risolve un problema del genere?

banryu79
24-06-2010, 14:03
for(int x=0; x<vettoreDiVettori.size(); x++){
System.out.println("indice: "+ x);
System.out.println("elemento: "+ vettoreDiVettori.get(x) );
}

questo mi ritorna l'output giusto (ma credo che sia concettualmente sbagliato iterare così, giusto?).

Perchè dici che è concettualmente sbagliato iterare in quel modo?
A me sembra vada benissimo...


Se invece vuoi proprio usare il "for each":

il problema è che gli elementi all'interno del vettore non sono unici, per cui con una cosa del tipo:
Codice:

for(ArrayList<Double> x : vettoreDiVettori){
System.out.println("indice: "+vettoreDiVettori.indexOf(x));
System.out.println("elemento: "+ vettoreDiVettori.get(x) );
}

ottengo un output sbagliato (perché la get mi torna sempre il PRIMO indice del numero che gli passo come argomento, e non quello che mi servirebbe...)

come si risolve un problema del genere?

E' chiaro che se nel vettoreDiVettori hai dei vettori duplicati la indexOf ti restituirà sempre il primo che incontra.

Devi gestire un contatore esplicitamente, in modo che ti faccia da indice:

int counter = 0;
for (ArrayList<Double> list : vettoreDiVettori) {
System.out.println("indice: "+counter);
System.out.println("elemento: "+ list);
counter++;
}

Ma a questo punto tanto vale utilizzare il "for classico".
Considera che il "for each" altro non è che "zucchero sintattico" poichè dietro le quinte usa un Iterator per scorrere la collezione.


Se invece ti interessa solo iterare su vettoreDiVettori per recuperare ogni singolo ArrayList<Double> contenuto (e non ti interessa l'indice) il codice si snellisce notevolmente:

for (ArrayList<Double> list : vettoreDiVettori)
System.out.println(list.toString());

equivale a questo:

Iterator<ArrayList<Double>> it = vettoreDiVettori.iterator();
while (it.hasNext()) {
ArrayList<Double> list = it.next();
System.out.println(list.toString());
}