Ajuda Função Retainall não funciona

Pessoal - Estou com um problema para utilizar a função retainall de uma lista de objetos. As listas que estou comparando não estão conseguindo reter os objetos iguais.

Segue o exemplo abaixo:

Alguem pode me ajudar por favor???

public class Veiculos implements Comparable{

private String cor;
private String marca;
private String tipo;
private int portas;

public void setCor(String cor) {
    this.cor = cor;
}

public String getCor() {
    return this.cor;
}

public void setMarca(String marca) {
    this.marca = marca;
}

public String getMarca() {
    return this.marca;
}

public void setTipo(String tipo) {
    this.tipo = tipo;
}

public String getTipo() {
    return this.tipo;
}

public void setPortas(int portas) {
    this.portas = portas;
}

public int getPortas() {
    return this.portas;
}

public int compareTo(Veiculos o) {
    throw new UnsupportedOperationException("Not supported yet.");
}

}

public class Carro extends Veiculos implements Comparable {

private String modelo;

public void setMode(String modelo){
    this.modelo = modelo;
}

public String getModelo(){
    return this.modelo;
}

public String getDetalhes(){
    return this.getCor() + " - " + this.getMarca() + " - " + this.getModelo() + " - " + this.getTipo() + " - " + this.getPortas();
}

}

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    LinkedHashSet<Carro> c1 = new LinkedHashSet<Carro>();
    LinkedHashSet<Carro> c2 = new LinkedHashSet<Carro>();

    for (int i = 0; i <= 10; i++) {
        Carro c = new Carro();

        c.setCor("Amarelo" + i);
        c.setMarca("Volkswagem" + i);
        c.setMode("pickup" + i);
        c.setTipo("Street" + i);
        c.setPortas(4);

        c1.add(c);
    }

    for (int i = 5; i <= 10; i++) {
        Carro cc = new Carro();

        cc.setCor("Amarelo" + i);
        cc.setMarca("Volkswagem" + i);
        cc.setMode("pickup" + i);
        cc.setTipo("Street" + i);
        cc.setPortas(4);

        c2.add(cc);
    }

   c1.retainAll(c2);

    System.out.println(c1.size());

    for (Carro impCarro : c1) {
        System.out.println(c1);
    }

O método retainAll na verdade utiliza o método equals de cada objeto contido na coleção para determinar se ele deve permanecer ou não na lista. Só que a implementação default de equals ( a que todos os objetos herdam de Object) só considera iguais objetos que apontam para o mesmo endereço de memória.
Para resolver este problema, basta você sobrescrever o equals em suas classes de negócio. Por exemplo, suponha que dois carros sejam considerados iguais caso possuam a mesma cor e marca. Você colocaria o seguinte em sua classe Carro:

@Override
public boolean equals(Object o) {

   if (!(o instanceof Carro)) {
      return false;
   }

   Carro c = (Carro) o;
   
   return (this.cor.equals(c.cor)) && (this.marca.equals(c.marca))
}

edit: Use sempre a tag code quando escrever códigos! :wink:

Para objetos do tipo carro funciona, porém o que na verdade eu quero é comparar objetos diferentes que possuem os valores dos atributos da classe pai iguais, ou seja,
se possuo uma Classe Pai Veiculos e 2 filhas Carro e Onibus, gostaria de saber todos os onibus e carros que possuem as mesmas caracteristicas (valores dos atributos)
herdados da classe pai.

Ex. Carro
cor = Branca; // Atributos herdados da classe pai;
marca = Volks; // Atributos herdados da classe pai;
modelo = carro; // Atributos particular da classe Carro;

Onibus
cor = Branca; // Atributos herdados da classe pai;
marca = Volks; // Atributos herdados da classe pai;
modelo = Onibus;   // Atributos particular da classe Onibus;

Com exemplo acima gostaria de utilizar a função retainall e conseguir reter os veiculos iguais. No exemplo acima eles são iguais pois possuem os mesmos atributos
herdados da classe pai.

carro.retainall(onibus) -> Retorno do size deveria ser 1 pois são iguais;
carro.removeall(onibus) -> Retorno do size deveria ser 0 pois eles são iguais;


public class Veiculos implements Comparable<Veiculos>{

    private String cor;
    private String marca;
   

    public void setCor(String cor) {
        this.cor = cor;
    }

    public String getCor() {
        return this.cor;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getMarca() {
        return this.marca;
    }

   
     @Override
    public int hashCode() {
        int hash = 3;
        hash = 53 * hash + (this.marca != null ? this.marca.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Veiculos other = (Veiculos) obj;
        if ((this.cor == null) ? (other.cor != null) : !this.cor.equals(other.cor)) {
            return false;
        }
        if ((this.marca == null) ? (other.marca != null) : !this.marca.equals(other.marca)) {
            return false;
        }        
        return true;
    }

    @Override
    public int compareTo(Veiculos o) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
}
    /* 
    CLASSE CARRO
    */
public class Carro extends Veiculos implements Comparable<Veiculos> {

    private String modelo;

    public void setMode(String modelo) {
        this.modelo = modelo;
    }

    public String getModelo() {
        return this.modelo;
    }

    public String getDetalhes() {
        return this.getCor() + " - " + this.getMarca() + " - " + this.getModelo() + " - " + this.getTipo() + " - " + this.getPortas();
    }

    @Override
    public boolean equals(Object o) {

        if (!(o instanceof Carro)) {
            return false;
        }

        Carro c = (Carro) o;

        return (getCor().equals(c.getCor())) && (this.getMarca().equals(c.getMarca()));
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 53 * hash + (this.modelo != null ? this.modelo.hashCode() : 0);
        return hash;
    }
    
    @Override
    public int compareTo(Veiculos o) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

/* Classe Onibus */

    public class Onibus extends Veiculos implements Comparable<Veiculos>{

    private int qtdAssentos;

    public void setQtdAssentos(int assentos) {
        this.modelo = assentos;
    }

    public String getQtdAssentos() {
        return this.qtdAssentos;
    }

    public String getDetalhes() {
        return this.getCor() + " - " + this.getMarca() + " - " + this.qtdAssentos() + " - " + this.getTipo() + " - " + this.getPortas();
    }

    @Override
    public boolean equals(Object o) {

        if (!(o instanceof Onibus)) {
            return false;
        }

        Onibus c = (Onibus) o;

        return (getCor().equals(c.getCor())) && (this.getMarca().equals(c.getMarca()));
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 53 * hash + (this.modelo != null ? this.modelo.hashCode() : 0);
        return hash;
    }

    @Override
    public int compareTo(Veiculos o) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}



public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        LinkedHashSet<Carro> listaCarros = new LinkedHashSet<Carro>();
        LinkedHashSet<Onibus> listaOnibus = new LinkedHashSet<Onibus>();

        for (int i = 0; i <= 10; i++) {
            Carro c = new Carro();
            c.setCor("Amarelo" + i);
            c.setMarca("Volkswagem" + i);
            c.setModelo("pickup" + i);
            listaCarros.add(c);
        }

        for (int i = 5; i <= 10; i++) {
            Onibus onibusVar = new Onibus();
            onibusVar.setCor("Amarelo" + i);
            onibusVar.setMarca("Volkswagem" + i);
            onibusVar.setQtdAssentos(i);            
            listaOnibus.add(onibusVar);
        }
        listaCarros.retainAll(listaOnibus);
        
        System.out.println(listaCarros.size());

        
        for(Carro cImprimi : listaCarros){
            System.out.println(cImprimi.getDetalhes());
        }

Neste caso, basta você sobrescrever o método equals na classe pai (Veiculo).

Obrigado … Funfou aqui!!! :stuck_out_tongue: