Remove element from an ArrayList in Java

8

I'm having trouble removing an element from my ArrayList, can anyone help me how?

public String remover(Pessoa umaPessoa) {
        String mensagem = "\n******** Pessoa removida com Sucesso! ********\n";
        listaPessoas.remove(umaPessoa);
        return mensagem;
    }
else if (entradaTeclado.equalsIgnoreCase("remover")){

        System.out.println("Digite o nome da pessoa que você quer remover:");
        entradaTeclado = leitorEntrada.readLine();
        String umNome = entradaTeclado;

        //removendo uma pessoa na lista de pessoas do sistema
        Pessoa umaPessoa = new Pessoa(umNome);
        String mensagem = umControle.remover(umaPessoa);
        System.out.println(mensagem);
        }
    
asked by anonymous 05.04.2014 / 01:53

4 answers

5

You should look for the object you want to remove before removing it. When you do:

Pessoa umaPessoa = new Pessoa(umNome);

You are creating a new object that is not in the list, and then you try to remove it. Since it is not in the list, it will not remove.

You can do this:
Being Pessoa at least something like:

public class Pessoa 
{
    public Pessoa(String nome)
    {
        m_nome = nome;
    }

    public String getNome()
    {
        return m_nome;
    }

    private String m_nome;
}

You can search and remove like this:

    ArrayList<Pessoa> pessoas = new ArrayList<>();

    // Adiciona algumas pessoas.
    pessoas.add(new Pessoa("José"));
    pessoas.add(new Pessoa("Maria"));
    pessoas.add(new Pessoa("Pedro"));

    System.out.print("Pessoas cadastradas:\n");
    for(int i = 0; i < pessoas.size(); i++)
    {
        System.out.print(pessoas.get(i).getNome() + "\n");
    }

    // Removendo Pedro:
    for(int i = 0; i < pessoas.size(); i++)
    {
        Pessoa p = pessoas.get(i);

        if(p.getNome().equals("Pedro"))
        {
            // Encontrou uma pessoa cadastrada com nome "Pedro".

            // Remove.
            pessoas.remove(p);

            // Sai do loop.
            break;
        }
    }

    System.out.print("Pessoas cadastradas após remoção:\n");
    for(int i = 0; i < pessoas.size(); i++)
    {
        System.out.print(pessoas.get(i).getNome() + "\n");
    }
    
05.04.2014 / 02:18
7

You can keep the code the way it is by changing only the Pessoa class. The problem, as mentioned, is that you are trying to remove an object that is not equal to any other in the list.

You can define when two objects are considered equal by overwriting the equals(Object o) method. In this case, just add something like the following code in class Pessoa :

@Override
public boolean equals(Pessoa outro) {
    if (this == outro) {
        return true;
    }
    if (outro == null) {
        return false;
    }
    return outro.m_pessoa == this.m_pessoa
        || (this.m_pessoa != null && this.m_pessoa.equals(outro.m_pessoa));
}

Recommended reading on using equals, hashCode and toString: link

    
02.06.2014 / 06:00
2

When you are doing

Pessoa umaPessoa = new Pessoa(umNome)

The newly created Person object is not the same object that contains the array. A simple solution would be to get the Pessoa object of the ArrayList that has the same name as umNome and send the returned object to the remove method.

    
05.04.2014 / 02:07
0

Using enhanced for, assuming this.students is an ArrayList, and that Student has properly done getters:

public boolean removeAluno(String name) {
    for(Aluno a:this.alunos) {
        if(a.getName().equals(name))
        this.alunos.remove(a);
        return true;
    }
    return false;
}
    
05.12.2018 / 02:09