Método removeAll ArrayList não funciona corretamente

Boa tarde!

Estou tentando comparar dois ArrayLists para excluir o que neles há em comum:

Ex:
Tenho uma classe pessoa com apenas um atributo (nome):


 class  Pessoa {


  private String nome;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

e no main preencho meus dois ArrayLists para compara-los e excluir o que for idêntico!

import java.util.ArrayList;
import javax.swing.JOptionPane;

public class Main {

    public static void main(String args[]) {
        ArrayList<Pessoa> lista1 = new ArrayList<Pessoa>();
        ArrayList<Pessoa> lista2 = new ArrayList<Pessoa>();

        Pessoa pessoa = new Pessoa();
        
        //colocando pessoas na lista1
        pessoa.setNome("Sandro");
        lista1.add(pessoa);
        pessoa.setNome("Helder");
        lista1.add( pessoa);

        //colocando pessoas na lista2
        pessoa.setNome("Sandro");
        lista2.add(pessoa);
        pessoa.setNome("Helder");
        lista2.add(pessoa);
        pessoa.setNome("Alisson");
        lista2.add(pessoa);

 

        lista1.removeAll(lista2); //quero que remova tudo que tem na lista 1 e na 2 ao mesmo tempo...
        
        //só deveria restar Alisson...
        
        //quando mando imprimir, realmente só resta alisson ele aparece repetido por 3 vezes...
        
        //parece-me que o método removeAll deleta mas não diminui o tamanho do ArrayLyst
        
        //e pior ainda, ele está duplicando o nome pra preencher os espaços vazios...
        

        for (int a = 0; a < lista2.size(); a++) {
            JOptionPane.showMessageDialog(null, "lista1.size(): " + lista2.size());
            System.out.println(lista2.get(a).getNome());
        }

    }

O Resultado é:
Alisson
Alisson
Alisson

Então o método removeAll remove o que está igual nas listas mas não reduz o tamanho do array?

Alguém pode ajudar-me?

Sua classe Pessoa não sobrepõe o método “public boolean equals”. Implemente esse método e tente novamente

Além do problema apontado pelo entanglement, tem ainda o seguinte:

  • Você chama o método remove na lista1 e depois que validar os elementos de lista2. Ela fica inalterada.

  • Você está adicionando o mesmo objeto na lista várias vezes. Dar um .setNome não muda a instancia, só o nome do mesmo objeto.

Realmente ao tentar apagar nada é apagado por isso restam três referencias apontadas para o mesmo objeto em sua lista onde a última alteração prevalecerá.
flw!

Na verdade, na lista1, todos objetos são apagados, justamente por serem a mesma instância do objeto.

O que continua igual é a lista2.

CONSEGUI RESOLVER ASSIM!

:smiley: :smiley: :smiley: :smiley:

[code]
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class Main {

public static void main(String args[]) {  
    ArrayList<Pessoa> lista1 = new ArrayList<Pessoa>();  
    ArrayList<Pessoa> lista2 = new ArrayList<Pessoa>();  

    Pessoa pessoa = new Pessoa();  
      
    //colocando pessoas na lista1  
    pessoa.setNome("Sandro");  
    lista1.add(pessoa);  
    pessoa.setNome("Helder");  
    lista1.add( pessoa);  

    //colocando pessoas na lista2  
    pessoa.setNome("Sandro");  
    lista2.add(pessoa);  
    pessoa.setNome("Helder");  
    lista2.add(pessoa);  
    pessoa.setNome("Alisson");  
    lista2.add(pessoa);  

for (int a = 0; a < lista1.size(); a++) {
lista2.remove(lista1.get(a)); // removendo o OBJETO Sandro e Helder da lista2
}

    for (int a = 0; a < lista2.size(); a++) { //imprimindo a lista2
        JOptionPane.showMessageDialog(null, "lista2.size(): " + lista2.size());
        System.out.println(lista2.get(a).getNome());
    }[/code]

A saída agora é:

Alisson

Não conseguiste resolver não.
O facto do output ser o esperado para esse caso não quer dizer que esteja correctamente resolvido…

Experimenta trocar a ordem dos nomes…

ví isso agora… rsrsrs tá brabo… :lol: :lol: :lol: :lol: :lol:

Em primeiro lugar, precisas de definir quando é que uma pessoa é igual a outra.
Para isso, tens de implementar os métodos equals e hashCode na classe Pessoa.

Depois, precisas criar várias pessoas, e não apenas uma a quem vais mudando o nome.