Questão nº 69

Questão de Tecnologia da Informação · FGV DATAPREV 2024 (nº 69)

FGV2024Analista de Tecnologia da Informação - Arquitetura, Engenharia e Sustentação TecnológicaTecnologia da Informação
Gabarito: Aver comentário ↓

Considere o seguinte trecho de código:

List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5);
Iterator<Integer> iterador = numeros.iterator();

while(iterador.hasNext()) {
    for(int i = 0; i < numeros.size(); i++) {
        if(i % 2 == 0) {
            iterador.remove(i);
        }
    }
}

Esse código tem por objetivo remover as posições pares de uma lista "números".
Assinale a opção que identifica os problemas com esse código.

Resposta comentada

Gabarito Alternativa A

Para remover elementos de uma coleção em Java de forma segura enquanto se itera sobre ela, é essencial usar o Iterator da coleção. O Iterator permite percorrer os elementos e, mais importante, removê-los sem causar problemas como a ConcurrentModificationException (exceção de modificação concorrente), que ocorreria se você tentasse modificar a coleção diretamente (por exemplo, usando list.remove(index)) enquanto um Iterator está ativo.

  • (A) Correta: A remoção de elementos usando um Iterator deve seguir um padrão específico: primeiro, você chama iterador.next() para obter o próximo elemento e avançar a posição do iterador. Em seguida, você pode chamar iterador.remove() para remover o último elemento retornado por next(). O método iterador.remove() não aceita argumentos (como um índice i). No código fornecido, iterador.remove(i) é um erro de compilação, pois o método remove() de Iterator não recebe parâmetros. Além disso, mesmo que fosse iterador.remove(), ele não foi precedido por uma chamada a iterador.next() dentro do for interno, o que também seria um uso incorreto. A alternativa descreve o método correto, indicando que o código atual está errado.

  • (B) Incorreta: O laço for interno está de fato mal posicionado e conceitualmente errado para a tarefa, mas a sugestão de movê-lo antes do while não resolve o problema fundamental de como a remoção deve ser feita com um iterador. A lógica de iterar por índice (for(int i = 0; i < numeros.size(); i++)) é incompatível com a iteração por Iterator para remoção segura.

  • (C) Incorreta: Esta afirmação é falsa. O método Iterator.remove() foi especificamente projetado para ser chamado durante a iteração para remover o elemento atual de forma segura, sem lançar ConcurrentModificationException. O problema no código não é que remove() não pode ser chamado, mas sim que está sendo chamado de forma incorreta (com um argumento e sem next() prévio).

  • (D) Incorreta: Embora a variável i seja um índice e a remoção de elementos altere os índices subsequentes (o que causaria IndexOutOfBoundsException se fosse numeros.remove(i)), o código chama iterador.remove(i). Como explicado na alternativa A, o método Iterator.remove() não aceita um índice como argumento. Portanto, o problema principal não é um erro de indexação no sentido de acessar uma posição inválida, mas sim um erro de assinatura do método e de uso conceitual do Iterator. A armadilha aqui é que o aluno pode se focar nos efeitos de remover por índice em uma lista (ConcurrentModificationException ou IndexOutOfBoundsException), mas o código não está removendo por índice da lista, e sim tentando usar o Iterator.remove() de forma errada.

  • (E) Incorreta: Substituir um laço while por um for (ou um for-each) não resolve o problema fundamental de como a remoção é feita. Um for-each loop (laço for aprimorado) não permite a remoção direta de elementos da coleção que está sendo iterada; tentar fazer isso resultaria em ConcurrentModificationException. A forma correta de remover elementos durante a iteração é sempre através do Iterator.remove().

Fonte: FGV DATAPREV 2024 Analista de Tecnologia da Informação - Arquitetura, Engenharia e Sustentação Tecnológica (Caderno Tipo 1). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho