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 {
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!
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());
}