PDA

View Full Version : [JAVA] Problema con ArrayList


Goldiaz
21-10-2016, 09:53
Ciao ragazzi vorrei chiedervi un piccolo aiuto per questo metodo:

public static void findpari(ArrayList<Integer> v){
for(int i=0; i<v.size(); i++)
{
if(v.get(i)%2!=0)
{
v.remove(i);
}
}
System.out.println(v);
}
mi da delle eccezioni e non riesco a far stampare l'ArrayList senza numeri dispari qualcuno potrebbe aiutarmi?
Grazie in anticipo.

vittorio130881
21-10-2016, 11:05
prova ad usare un double e non integer
non vorrei andasse in errore per quello.....

Goldiaz
21-10-2016, 11:08
ho risolto così:

public static void findPari (ArrayList<Integer> al){
for (int i = 0 ; i < al.size(); i++) {
if( al.get(i)%2!=0 )
al.remove(i--);
}
}

sottovento
21-10-2016, 11:12
ho risolto così:

public static void findPari (ArrayList<Integer> al){
for (int i = 0 ; i < al.size(); i++) {
if( al.get(i)%2!=0 )
al.remove(i--);
}
}

Beh.... il problema e' che modifichi l'arraylist "in corsa", cioe' mentre lo stai scandendo. Non e' il massimo della vita, no?
Se proprio ti piace questa soluzione, potresti pensare a fare qualcosa di piu' pulito, per esempio scandendo l'arraylist dal fondo. Ti basta cambiare il for in modo che vada da al.size()-1 a 0 (estremi inclusi)

[Kendall]
21-10-2016, 11:26
Modificare una lista mentre la si sta iterando non è una buona idea, come giustamente ti ha scritto Sottovento.
Un metodo sicuro per farlo è usando il suo Iterator:


public static void findPari(Collection<Integer> collection) {
for (Iterator<Integer> it = collection.iterator(); it.hasNext(); ) {
if (it.next() % 2 != 0) it.remove();
}
}

sottovento
21-10-2016, 13:11
;44142417']Modificare una lista mentre la si sta iterando non è una buona idea, come giustamente ti ha scritto Sottovento.
Un metodo sicuro per farlo è usando il suo Iterator:


public static void findPari(Collection<Integer> collection) {
for (Iterator<Integer> it = collection.iterator(); it.hasNext(); ) {
if (it.next() % 2 != 0) it.remove();
}
}

Esatto! Oppure si puo' fare in una sola riga:

list.removeAll(list.stream().filter(i -> i%2 != 0).collect(Collectors.toList()));

[Kendall]
21-10-2016, 13:53
Esatto! Oppure si puo' fare in una sola riga:

list.removeAll(list.stream().filter(i -> i%2 != 0).collect(Collectors.toList()));


Giusto per ricollegarmi all'altra discussione dove parlavo di Kotlin, ecco un altro esempio della semplicità di questo linguaggio:


list.removeAll { it % 2 != 0 }


Fidati, dacci un'occhiata. Se da una parte in ambito lavorativo non è semplice un simile passaggio (anche se ho letto di diverse realtà dove stanno valutando il passaggio, anche solo per alcuni progetti o per certe finalità) per i progetti personali lo trovo in tutto e per tutto migliore del Java.
È perfettamente intercambiabile, ha come SDK minimo Java 6, ha performance del tutto analoghe al Java e una libreria standard piccolissima (e per tutto il resto si appoggia alle librerie standard del Java).
Tra l'altro la guida ufficiale te la leggi in un paio di giornate a dir tanto.

Io personalmente lo sto usando con grande soddisfazione in un progetto per Android, che era partito in Java ma che ho poi tradotto completamente in Kotlin (e col cavolo che torno indietro, mi ci trovo mille volte meglio).

sottovento
21-10-2016, 14:10
;44143027']Giusto per ricollegarmi all'altra discussione dove parlavo di Kotlin, ecco un altro esempio della semplicità di questo linguaggio:


list.removeAll { it % 2 != 0 }


Fidati, dacci un'occhiata. Se da una parte in ambito lavorativo non è semplice un simile passaggio (anche se ho letto di diverse realtà dove stanno valutando il passaggio, anche solo per alcuni progetti o per certe finalità) per i progetti personali lo trovo in tutto e per tutto migliore del Java.
È perfettamente intercambiabile, ha come SDK minimo Java 6, ha performance del tutto analoghe al Java e una libreria standard piccolissima (e per tutto il resto si appoggia alle librerie standard del Java).
Tra l'altro la guida ufficiale te la leggi in un paio di giornate a dir tanto.

Io personalmente lo sto usando con grande soddisfazione in un progetto per Android, che era partito in Java ma che ho poi tradotto completamente in Kotlin (e col cavolo che torno indietro, mi ci trovo mille volte meglio).

Grazie per il suggerimento, ci daro' un'occhiata.
Tuttavia mi sembra che le caratteristiche di Kotlin siano molto simili a quelle di Groovy in termini di intercambiabilita' con Java, etc.

In Groovy la stessa operazione e'

list.removeAll { it % 2 != 0}


piuttosto simili, no?
Comunque ho sentito parlar bene di Kotlin, credo che ci daro' un'occhiata. Visto che siamo OT: e' semplice creare una GUI in Kotlin?
Sia Swing sia Android?

[Kendall]
21-10-2016, 14:34
Grazie per il suggerimento, ci daro' un'occhiata.
Tuttavia mi sembra che le caratteristiche di Kotlin siano molto simili a quelle di Groovy in termini di intercambiabilita' con Java, etc.

In Groovy la stessa operazione e'

v.removeAll { it % 2 != 0}


piuttosto simili, no?
Comunque ho sentito parlar bene di Kotlin, credo che ci daro' un'occhiata. Visto che siamo OT: e' semplice creare una GUI in Kotlin?
Sia Swing sia Android?

Certamente Groovy è un'altra ottima alternativa ma, se non erro (il mio rapporto con Groovy si limita solo ad alcuni test), paga un pò sotto il punto di vista delle performance data la sua natura dinamica.

Per il discorsi GUI, Android è assolutamente compatibile con kotlin (lo uso giornalmente).
Per Swing mi risulta essere compatibile, così come JavaFX tramite il progetto KotlinFX, però non avendo mai programmato con Kotlin per realizzare GUI desktop le mie informazioni si fermano qui.