Remover item de uma colecao?

3 respostas
aorocha

Pessoal estou tentando remover um obj de um colecao, mas ele esta dando erro, estou tentando assim: for(Object obj : coll){ Permissao per = (Permissao)obj; if (per.getAtivo() == 0){ coll.remove(per); } }
assim que ele remove um obj ele gerar esse error:Exception in thread "main" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(Unknown Source) at java.util.HashMap$KeyIterator.next(Unknown Source) at org.hibernate.collection.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:555) at br.com.maringa.compGerusa.login.Login.retitarPermissaoInativa(Login.java:65) at br.com.maringa.compGerusa.login.Login.logar(Login.java:54) at TesteLogin.main(TesteLogin.java:13)
como faço para remover esse obj sem dar erro?

3 Respostas

chicocx

bom, eu acredito nao ser possivel remover um elemento no momento da utlizização. Assim tente:

no código que vc mostrou

Permissao per = new Permissao(); per.setAtivo(0); coll.remove(per)

na classe Permissao

public boolean equals(Object obj){ Permissao p = (Permissao)obj; if( this.ativo == p.ativo ){ return true; } else{ return false; } }

assim no metodo equals vc define que uma permissao vai ser igual a outra quando o campo ativo assim for…

1112

Olá,

O enhanced for para Collections é um atalho para um for usando Iterator. Ou seja, o seu loop ficaria mais ou menos assim:

Iterator i = coll.iterator();
    while( i.hasNext() ) {
        Object obj = i.next();
        Permissao per = (Permissao)obj;
        if (per.getAtivo() == 0){
            coll.remove(per); // Esta linha causaria exceção
        }
    }

Como você pode ver aqui, o Iterator não permite uma alteração da Collection enquanto se itera sobre ela.

Uma solução rápida e “suja” pro seu problema seria:

for( int i = 0; i < coll.size(); i++ ) {
    Object obj = coll.get(i);
    Permissao per = (Permissao)obj;
    if (per.getAtivo() == 0){
        coll.remove(per);
        i--; // Esta linha é necessária, para evitar um IndexOutOfBoundsException
    }
}

A linha i– é necessária, pois quando você remove um elemento, o tamanho da lista e as posições dos elementos nela se alteram.

P

e isso, seria mais sujo ?

ter uma segunda collection, de itens ativos…e no laco, verificar se a permissao e ativa, se for, inclui na collection de itens ativos…

aorocha, vc esta usando o sdk 5, certo ?
tente usar generics… seu codigo vai ficar mais limpo…e adeus casts !!!

Criado 8 de maio de 2006
Ultima resposta 8 de mai. de 2006
Respostas 3
Participantes 4