Lim
09-07-2010, 11:56
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:
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);
}
}
Questa prima implementazione restituisce (giustamente):
java.lang.IndexOutOfBoundsException, esattamente alla metà delle dimensioni iniziali della lista.
L'altra implementazione, invece:
for(MyObj o: lista){
if(!(o.isAlive())) {
lista.remove(o);
}
}
viene lanciata l'eccezione: java.util.ConcurrentModificationException
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?
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:
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);
}
}
Questa prima implementazione restituisce (giustamente):
java.lang.IndexOutOfBoundsException, esattamente alla metà delle dimensioni iniziali della lista.
L'altra implementazione, invece:
for(MyObj o: lista){
if(!(o.isAlive())) {
lista.remove(o);
}
}
viene lanciata l'eccezione: java.util.ConcurrentModificationException
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?