Removendo Elementos de uma Lista Sem Dor de Cabeça!
Estruturas de Dados são fundamentais para a manipulação eficiente de dados. Existem vários tipos prontos e disponíveis no Java, eliminando a necessidade de reinventar a roda ao implementá-los do zero. No entanto, isso não significa que não devemos estudá-los e aprender como usá-los. Ao compreender o funcionamento das estruturas de dados, expandimos significativamente nossas opções para resolver problemas.
Uma estrutura de dados amplamente utilizada em Java é a List, que consiste em um conjunto de elementos do mesmo tipo, ligados continuamente na memória. Ao lidar com consultas a um banco de dados para obter uma lista de pessoas, é comum que os programadores usem uma lista para armazenar os valores na memória e manipulá-los conforme necessário.
Considere um cenário simples em que, dada uma lista de inteiros, é necessário obter e excluir um elemento específico. Essa situação pode ser comparada a um carrinho de compras, onde há uma lista de produtos desejados, e ao longo do tempo, é possível adicionar ou remover itens dessa lista.
No entanto, ao tentar remover um elemento da lista, é crucial proceder com cautela, pois a implementação dessa funcionalidade pode apresentar desafios e erros.
A abordagem incorreta para a remoção de um elemento pode ser exemplificada da seguinte forma:
O erro neste código ocorre porque estamos utilizando um for-each para iterar sobre a lista e, ao tentar remover o elemento, surge um problema. Durante a iteração com um for-each, um objeto Iterator é criado internamente. Ao tentar modificar a lista, a exceção ConcurrentModificationException é lançada, indicando que a lista não pode ser alterada devido a um erro de concorrência durante a tentativa de remoção do elemento.
Para resolver esse problema, é possível criar explicitamente um Iterator e utilizá-lo para iterar sobre a lista, como exemplificado no código a seguir:
Ao empregar o método hasNext(), verificamos se ainda há elementos para iterar, e o método next() nos retorna o elemento atual da iteração. Poderíamos também utilizar o comando break para encerrar a iteração assim que removemos o elemento desejado, otimizando o código dependendo da posição do elemento na lista.
O resultado da remoção é: