Pular para o conteúdo principal

Questão de Programação — Linguagens de programação — FGV 2024

ProgramaçãoLinguagens de programação
Código
fg079635
Banca
FGV
Órgão
DATAPREV
Ano
2024
Nível
Superior
Cargo
ATI - Arquitetura, Engenharia e Sustentação Tecnológica
Considere o seguinte trecho de código:Q69.png 393×165Esse 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.
  1. AA remoção de elementos dentro de um laço for deve ser feita usando os métodos next() e remove() do iterador.
  2. BO laço for está mal posicionado, e deveria ser usado antes do laço while para iterar corretamente.
  3. CO método remove nunca pode ser chamado durante a iteração com um iterador, pois isso sempre resulta em uma exceção.
  4. DA variável i utilizada no laço for está causando um erro de indexação ao tentar acessar elementos que já foram removidos.
  5. EO laço while deve ser substituído por um laço for para evitar conflitos com o iterador.
Revelar gabarito e comentário

GabaritoA — A remoção de elementos dentro de um laço for deve ser feita usando os métodos next() e remove() do iterador.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Remoção de elementos durante iteração em Java

Gabarito: letra A. O problema central do código é tentar remover elementos de uma coleção enquanto se itera sobre ela com um laço for tradicional (baseado em índice), o que causa inconsistência entre o índice e o tamanho da lista. A forma segura é usar um Iterator e seus métodos next() e remove(), que garantem a remoção correta durante a iteração.

O trecho de código apresentado tem como objetivo remover as posições pares de uma lista chamada "números". Para entender o problema, é preciso compreender como funciona a iteração e a remoção em coleções Java. Quando usamos um laço for tradicional com um índice i e, dentro dele, chamamos o método remove() da lista, estamos alterando a estrutura da lista enquanto a percorremos. Isso desloca os elementos subsequentes para posições anteriores, fazendo com que o índice i não corresponda mais ao elemento que deveria ser processado. Por exemplo, se a lista é [0, 1, 2, 3, 4] e removemos o elemento no índice 0, o elemento que estava no índice 1 passa a ocupar o índice 0, e o laço, ao incrementar i para 1, pulará o elemento que agora está na posição 0. Esse é o clássico problema de remoção durante iteração.

A solução idiomática em Java para remover elementos durante a iteração é usar um Iterator. O Iterator é um objeto que permite percorrer a coleção e, de forma segura, remover o último elemento retornado por next() através do método remove(). Isso é possível porque o Iterator mantém um controle interno da posição atual, e a remoção é feita de forma consistente com a iteração. O uso do Iterator evita a ConcurrentModificationException, que ocorre quando a estrutura da coleção é modificada durante a iteração sem o uso do mecanismo adequado.

A alternativa A afirma que "A remoção de elementos dentro de um laço for deve ser feita usando os métodos next() e remove() do iterador." Essa afirmação está correta, pois é exatamente essa a prática recomendada. As demais alternativas apresentam soluções ou diagnósticos incorretos para o problema.

  1. 1Iterar com Iterator
  2. 2next() avança
  3. 3remove() remove o atual
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

Esta alternativa identifica corretamente o problema e a solução. O código usa um laço for tradicional com índice, e a remoção de elementos durante a iteração deve ser feita com um Iterator, que fornece os métodos next() e remove(). O Iterator é a forma segura de remover elementos durante a iteração, pois evita inconsistências de índice e a ConcurrentModificationException.

Alternativa B — ❌ Incorreta

Afirma que o laço for está mal posicionado e deveria ser usado antes do laço while. Isso não faz sentido no contexto do problema. O problema não é a posição do laço, mas sim a forma como a remoção é feita durante a iteração. A ordem dos laços não resolve a questão da remoção segura.

Alternativa C — ❌ Incorreta

Afirma que o método remove nunca pode ser chamado durante a iteração com um iterador, pois isso sempre resulta em uma exceção. Isso é falso. O método remove() do Iterator é projetado exatamente para ser chamado durante a iteração, e é a forma correta de remover elementos. A ConcurrentModificationException ocorre quando se modifica a coleção diretamente (por exemplo, chamando list.remove()) durante a iteração, não quando se usa o Iterator.remove().

Alternativa D — ❌ Incorreta

Afirma que a variável i utilizada no laço for está causando um erro de indexação ao tentar acessar elementos que já foram removidos. Embora isso possa ser uma consequência do problema, a afirmação é imprecisa. O erro não é de indexação, mas sim de lógica: ao remover um elemento, os índices dos elementos subsequentes mudam, e o laço pode pular elementos ou tentar acessar índices fora dos limites. A causa raiz é a remoção durante a iteração, não um erro de indexação em si.

Alternativa E — ❌ Incorreta

Afirma que o laço while deve ser substituído por um laço for para evitar conflitos com o iterador. Isso não resolve o problema. O conflito não é entre while e for, mas sim entre a remoção de elementos e a iteração. A solução correta é usar um Iterator, independentemente de o laço ser while ou for.

Gabarito: letra A

Link permanente: /questoes/fg079635