Uso de Listas

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;  //
						
	}
				
}

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?

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.

if (item.getValue() == usuario.getId()) {
listaCadastrados.add(item.getValue().toString() + " - " + item.getLabel());
this.setUsuariosSelecionados(listaCadastrados);

  int index = this.getItens().indexOf(item);  
  it.remove(); //remove o elemento atual

}
} [/code]

[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 
}

}

acredito q seje issu q vc quer
Abraço

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.

:slight_smile: