|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
[Java] Rimozione iterativa da una lista
Salve a tutti.
Sono appena incappato in un problema nella gestione delle liste. Ho un insieme di oggetti che popolano una lista. Ad intervalli di tempo prestabiliti, vorrei controllare OGNI elemento della lista per verificare una condizione su un attributo di ogni oggetto. Se la condizione è vera (o falsa) l'oggetto in questione deve essere rimosso dalla lista. Ho tentato due approcci, per semplicità incollo il codice qui sotto: Codice:
public List<MyObj> lista=new ArrayList<MyObj>();
...
...
int size=lista.size();
for(int i=0;i<size;i++){
if(!(lista.get(i).isAlive())) {
lista.remove(i);
}
}
java.lang.IndexOutOfBoundsException, esattamente alla metà delle dimensioni iniziali della lista. L'altra implementazione, invece: Codice:
for(MyObj o: lista){
if(!(o.isAlive())) {
lista.remove(o);
}
}
Ho provato anche con gli Iterator, ma viene lanciata comunque java.util.ConcurrentModificationException Sono sicuro che c'è un modo semplice per risolvere questo problema, ma al momento non mi viene proprio in mente. Qualcuno ha un suggerimento? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Codice:
List<myObj> objectToRemove=new ArrayList<myObj>();
for(MyObj o: lista){
if(!(o.isAlive())) {
objectToRemove.add(o);
}
}
for(MyObj o: objectToRemove){
lista.remove(o);
}
Ciao |
|
|
|
|
|
#3 | ||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Cioè così: Codice:
Iterator<MyObject> it = lista.iterator();
while (it.hasNext()) {
MyObject o = it.next();
if (! o.isAlive())
it.remove();
}
Codice:
Iterator<MyObject> it = lista.iterator();
while (it.hasNext())
if (it.next().isNotAlive())
it.remove();
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 09-07-2010 alle 13:12. |
||
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Grazie per le celeri risposte!!
Effettivamente volevo evitare di creare una lista di appoggio ogni volta che devo fare il controllo (che avviene ad ogni istante di tempo della mia simulazione), ma se non dovessero esserci altri modi... Verifico anche il suggerimento di banryu79, è molto simile al tentativo che avevo fatto con gli iterator, ma non mi ero accorto che potevo dichiararlo così: Iterator<MyObject> ...., forse questa è la soluzione + rapida. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Si, perfetto!
Con gli Iterator è rapido ed indolore, funziona alla perfezione!!! Grazie a tutti!!! |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Codice:
for(MyObj o: lista){
if(!(o.isAlive())) {
lista.remove(o);
}
}
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:03.




















