Iterator vs listIterator (Duvida percorrendo lista e removendo elemento)

Oi pessoal,

Tenho uma duvida. Estava estudando coleções (List, Set, Queue, SorteSet, Deque, Map, etc…) e obviamente acabei lendo sobre Iterator. E na documentacao diz que o Iterator e a unica forma segura de remover um elemento durante uma iteracao;

Note that Iterator.remove is the only safe way to modify a collection during iteration; the behavior is unspecified if the underlying collection is modified in any other way while the iteration is in progress.
https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

Logo tentei fazer um exemplo simples usando o iterator.
Na minha lista eu verifico 2 valores e removo o menor entre eles.

Um código clássico para fazer isso seria:
//classe Division
//(…) private List teams = new ArrayList<>();
//variavel divisionLest
//Division divisionLest = new Division(“xxxxxx”);

	for (int i = 0; i < divisionLest.getTeams().size(); i++) {
		int x = i+1;
		Team t1 = divisionLest.getTeam(i);
		Team t2 = divisionLest.getTeam(x);
		
		if (t1.getScore() < t2.getScore()) {
			//remove t1
			divisionLest.getTeams().remove(i);
		} else {
			//remove t2
			divisionLest.getTeams().remove(x);
		}						
	}

Tentei fazer o mesmo usando Iterator, mas ele nao possui um “previous”.
https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html

Entao usei o listIterator, mas o listIterator nao possui o “elemento atual”.
A ListIterator has no current element; its cursor position always lies between the element that would be returned by a call to previous() and the element that would be returned
https://docs.oracle.com/javase/7/docs/api/java/util/ListIterator.html

Entao a ideia basica do meu codigo seria

	ListIterator<Team> listIterator = divisionLest.getTeams().listIterator();
	
	while (listIterator.hasNext()) {

		Team t1 = listIterator.atual(); //Metodo nao existe
		Team t2 = listIterator.next();			
		System.out.println(listIterator.nextIndex());
		
		if (t1.getScore() < t2.getScore()) {
			//remove t1
		} else {
			//remove t2
		}
	}

Mas e obvio que isso nao funciona. Alguem tem alguma sugestao de como faze-lo?

Obrigado

Para toda e qualquer classe/interface/enum no Java (qualquer linguagem, na verdade) (e deveria ser assim nos códigos que criamos) há ao menos uma razão (teoricamente, deveria ser apenas, única e exclusivamente, por esta razão) para que este elemento exista e seja como é.
Iterator tem uma finalidade: permitir que você percorra os elementos de uma coleção e execute ações como a exclusão segura.
O ListIterator é uma especialização do iterator que foi desenvolvida para garantir coisas que o iterator não faz, como “andar para trás” (método hasPrevious).
“Ah, então se existe, toda vez que eu usar List eu vou usar ListIterator”. Não necessariamente você precisa usar só por que existe. A grande maioria das vezes, o Iterator supre todas as necessidades e faz o trabalho adequadamente. Porém, pode ocorrer situações (como a necessidade de iterar do último para o primeiro elemento) em que você precisa de coisas que o Iterator não provê, mas, que o ListIterator oferece.

Neste caso específico, não é uma boa ideia usar o iterator, realmente. Talvez, o ideal fosse implementar uma lógica mais elaborada, onde você fizesse a comparação, identificando o menor valor em um universo de 2 e, então, invocasse um método onde realizasse a exclusão do elemento referente ao tal valor.
Note, você está aumentando a complexidade no processo de exclusão, o que não combina com o ideal do Iterator/ListIterator: resolver de forma simples a situação.

1 curtida

Muito obrigado Darlan,
Valeu pela força.

=)