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…
for (SelectItem item : this.getItens()) {
// Verifica se um deterninado usuario já está habilitado e o
// excluir da lista de opção para associação.
if (item.getValue() == usuario.getId()) {
listaCadastrados.add(item.getValue().toString() + " - " + item.getLabel());
this.setUsuariosSelecionados(listaCadastrados);
int index = this.getItens().indexOf(item);
this.getItens().remove(index);
break; //
}
}
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:
[code]Iterator<SelectItem> it = this.getItens().iterator();
while (it.hasNext()) {
SelectItem item = it.next();
// Verifica se um deterninado usuario já está habilitado e o
// excluir da lista de opção para associação.
[quote=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…
[code]
for (SelectItem item : this.getItens()) {
// Verifica se um deterninado usuario já está habilitado e o
// excluir da lista de opção para associação.
if (item.getValue() == usuario.getId()) {
listaCadastrados.add(item.getValue().toString() + " - " + item.getLabel());
this.setUsuariosSelecionados(listaCadastrados);
int index = this.getItens().indexOf(item);
this.getItens().remove(index);
break; //
}
}
[/code][/quote]
cara acredito q se vc fizer um for assim acho q resolveria seu problema
for (int i=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);
int index = this.getItens().indexOf(item);
this.getItens().remove(index);
i--; // porque vc removeu um item da lista pra ele percorrer aquela posição novamente
}
}
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.
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.