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.
/** * @param args the command line arguments */publicstaticvoidmain(String[]args){LinkedHashSet<Carro>c1=newLinkedHashSet<Carro>();LinkedHashSet<Carro>c2=newLinkedHashSet<Carro>();for(inti=0;i<=10;i++){Carroc=newCarro();c.setCor("Amarelo"+i);c.setMarca("Volkswagem"+i);c.setMode("pickup"+i);c.setTipo("Street"+i);c.setPortas(4);c1.add(c);}for(inti=5;i<=10;i++){Carrocc=newCarro();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(CarroimpCarro: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:
edit: Use sempre a tag code quando escrever códigos!
L
lucasborges
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;
publicclassVeiculosimplementsComparable<Veiculos>{privateStringcor;privateStringmarca;publicvoidsetCor(Stringcor){this.cor=cor;}publicStringgetCor(){returnthis.cor;}publicvoidsetMarca(Stringmarca){this.marca=marca;}publicStringgetMarca(){returnthis.marca;}@OverridepublicinthashCode(){inthash=3;hash=53*hash+(this.marca!=null?this.marca.hashCode():0);returnhash;}@Overridepublicbooleanequals(Objectobj){if(obj==null){returnfalse;}if(getClass()!=obj.getClass()){returnfalse;}finalVeiculosother=(Veiculos)obj;if((this.cor==null)?(other.cor!=null):!this.cor.equals(other.cor)){returnfalse;}if((this.marca==null)?(other.marca!=null):!this.marca.equals(other.marca)){returnfalse;}returntrue;}@OverridepublicintcompareTo(Veiculoso){thrownewUnsupportedOperationException("Not supported yet.");}}/* CLASSE CARRO */publicclassCarroextendsVeiculosimplementsComparable<Veiculos>{privateStringmodelo;publicvoidsetMode(Stringmodelo){this.modelo=modelo;}publicStringgetModelo(){returnthis.modelo;}publicStringgetDetalhes(){returnthis.getCor()+" - "+this.getMarca()+" - "+this.getModelo()+" - "+this.getTipo()+" - "+this.getPortas();}@Overridepublicbooleanequals(Objecto){if(!(oinstanceofCarro)){returnfalse;}Carroc=(Carro)o;return(getCor().equals(c.getCor()))&&(this.getMarca().equals(c.getMarca()));}@OverridepublicinthashCode(){inthash=3;hash=53*hash+(this.modelo!=null?this.modelo.hashCode():0);returnhash;}@OverridepublicintcompareTo(Veiculoso){thrownewUnsupportedOperationException("Not supported yet.");}}/* Classe Onibus */publicclassOnibusextendsVeiculosimplementsComparable<Veiculos>{privateintqtdAssentos;publicvoidsetQtdAssentos(intassentos){this.modelo=assentos;}publicStringgetQtdAssentos(){returnthis.qtdAssentos;}publicStringgetDetalhes(){returnthis.getCor()+" - "+this.getMarca()+" - "+this.qtdAssentos()+" - "+this.getTipo()+" - "+this.getPortas();}@Overridepublicbooleanequals(Objecto){if(!(oinstanceofOnibus)){returnfalse;}Onibusc=(Onibus)o;return(getCor().equals(c.getCor()))&&(this.getMarca().equals(c.getMarca()));}@OverridepublicinthashCode(){inthash=3;hash=53*hash+(this.modelo!=null?this.modelo.hashCode():0);returnhash;}@OverridepublicintcompareTo(Veiculoso){thrownewUnsupportedOperationException("Not supported yet.");}}publicclassMain{/** * @param args the command line arguments */publicstaticvoidmain(String[]args){// TODO code application logic hereLinkedHashSet<Carro>listaCarros=newLinkedHashSet<Carro>();LinkedHashSet<Onibus>listaOnibus=newLinkedHashSet<Onibus>();for(inti=0;i<=10;i++){Carroc=newCarro();c.setCor("Amarelo"+i);c.setMarca("Volkswagem"+i);c.setModelo("pickup"+i);listaCarros.add(c);}for(inti=5;i<=10;i++){OnibusonibusVar=newOnibus();onibusVar.setCor("Amarelo"+i);onibusVar.setMarca("Volkswagem"+i);onibusVar.setQtdAssentos(i);listaOnibus.add(onibusVar);}listaCarros.retainAll(listaOnibus);System.out.println(listaCarros.size());for(CarrocImprimi:listaCarros){System.out.println(cImprimi.getDetalhes());}
P
pango
Neste caso, basta você sobrescrever o método equals na classe pai (Veiculo).