Dúvida em ArrayList

2 respostas Resolvido
listarraylistprogramação
M

Olá! Tenho uma dúvida na seguinte questão:

Crie uma classe TesteArrayListString que possui um método main.
Dentro do main crie um ArrayList de String (lista1).
Adicione 10 Strings informadas pelo usuário.
Percorra a lista verificando se o usuário digitou alguma String com menos de 3 caracteres. Em caso positivo, adicione essa String em outra lista que você vai criar (lista2).
Utilizando o método remove, remova todos os elementos dessa segunda lista (lista2) da lista principal (lista1).
No final imprima a quantidade de Strings da lista.

Minha tentativa de código ficou assim:

package aula09;

import java.util.ArrayList;
import java.util.Scanner;

/**
 *
 * @author Matias
 */
public class TesteArrayListString
{
    public static void main(String[] args)
    {
        ArrayList<String> lista1 = new ArrayList<>();
        ArrayList<String> lista2 = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        String nome;
        
        //Adiciona Strings a lista1
        for(int i = 0; i < 10; i++)
        {
            System.out.print("Digite qualquer coisa: ");
            nome = sc.next();
            lista1.add(nome);
        }
        
        /*Essa parte deveria adicionar Strings com menos de 3 caracteres da lista1 a lista2.
         *E logo após remover essa String da lista1.
         *Porém não estou obtendo o resultado esperado na saida!
         */
        for (int i = 0; i < lista1.size(); i++)
        {
            if(lista1.get(i).length() < 3)
            {
                lista2.add(lista1.get(i));
                lista1.remove(i);
            }
        }
        
        //Imprime o tamanho das listas.
        System.out.println("Lista 1: " + lista1.size());
        System.out.println("Lista 2: " + lista2.size());
    }
}

Porém quando executo o código e tento atender o quesito de adicionar Strings com menos de 3 caracteres a lista2 e remove-los da lista1, não obtenho o resultado esperado. Se alguém puder me ajudar fico grato! Agradeço desde já! :wink:

2 Respostas

P
Solucao aceita

for (inicio; condição de parada; condição de incremento/decremento)

Condição de parada: lista1.size();

Sua lista começa com  lista1.size() = 10;

Depois de remover um elemento,  lista1.size() = 9;

Outra vez,  lista1.size() = 8.

Assim, a condição de parada não é equivalente a uma constante, mas a uma variável.

Tem outro problema.
Se você tentar:

final int size = lista1.size();
for (int i = 0; i < size; i++)

O for vai de 0 a 10, e quando você remover um elemento da lista, ela vai ficar com list.size() = 9 e esse desnivelamento vai implicar em ArrayIndexOutOfBoundsException, já que o limite do for é dez e o array tem 9 posições (de 0 a 8).

Ou seja, você não deve remover os elementos da lista percorrendo-a de forma crescente.

Mas você pode remover os elementos da lista percorrendo-a de forma decrescente

for (int i = lista1.size() - 1; i > -1; i--)

Preferível:

int inicio =  lista1.size() - 1;//inicio do loop apontando para o último elemento da fila
for (int i =inicio; i > -1; i--){//decremento, para ir até o primeiro elemento da fila 
    if (lista1.get(i).length() < 3) {
        lista2.add(lista1.get(i));
        lista1.remove(i);
    }
}

Resumo: o erro estava em percorrer a lista de forma crescente, quando deveria percorrer de forma decrescente.

M

@PedreiroDeSoftware muito obrigado! Você explicou muito bem, consegui entender perfeitamente onde eu estava errando! :sweat_smile: Dúvida sanada, muito obrigado mais uma vez!

Criado 6 de dezembro de 2019
Ultima resposta 9 de dez. de 2019
Respostas 2
Participantes 2