Pessoal, no foreach do código abaixo, eu retiro um objeto da lista e na próxima interação em cima do this.getItens() ele não atualiza a quantidade de itens na lista causando um Exception. Resolvi colocando um break. Está seria a forma mais correta ou há outra forma. Gratos a todos…
Colocando um break, você só vai pegar a primeira ocorrência na lista que satisfaça a sua condição, é isso que você quer fazer?
ViniGodoy
O break irá sair do for e, portanto, você só removerá um único objeto. Se é isso que você quer, então é a melhor forma.
Entretanto, se você quiser remover todos os objetos da lista com um determinado critério, o for teria que continuar. Nesse caso, você precisa usar o Iterator:
Iterator<SelectItem> it = this.getItens().iterator();while(it.hasNext()){SelectItemitem=it.next();//Verificaseumdeterninadousuariojáestáhabilitadoeo//excluirdalistadeopçãoparaassociação.if(item.getValue()==usuario.getId()){listaCadastrados.add(item.getValue().toString()+" - "+item.getLabel()); this.setUsuariosSelecionados(listaCadastrados); intindex=this.getItens().indexOf(item); it.remove(); //remove o elemento atual}
}
G
gustavorozolin
jayro:
Pessoal, no foreach do código abaixo, eu retiro um objeto da lista e na próxima interação em cima do this.getItens() ele não atualiza a quantidade de itens na lista causando um Exception. Resolvi colocando um break. Está seria a forma mais correta ou há outra forma. Gratos a todos...
cara acredito q se vc fizer um for assim acho q resolveria seu problema
for(inti=0; i<this.getItens().size(); i++){if(item.getValue()==usuario.getId()){
if(item.getValue()==usuario.getId()){
listaCadastrados.add(item.getValue().toString()+" - "+item.getLabel());this.setUsuariosSelecionados(listaCadastrados);intindex=this.getItens().indexOf(item);this.getItens().remove(index);i--; // porque vc removeu um item da lista pra ele percorrer aquela posição novamente
}
}
acredito q seje issu q vc quer
Abraço
ViniGodoy
Cuidado que esse for é extremamente lento. Isso porque a cada iteração, você usa o indexOf.
O indexOf percorre a lista inteira para encontrar um objeto.
Ou seja, se você tiver N objetos você irá percorre-los N vezes, o que faz o tempo do seu método ser N²!
Esse método só seria rápido se no lugar de uma List você tivesse um set. Ainda assim, a solução com o iterator é mais simples e não sofre desses problemas.
jayro
ViniGodoy, gustavorozolin e ateubh, Fico grato pelo exclarecimento. Na verdade a intenção seria de remover todos os itens que obedecesse ao critério. Obrigado.