importjava.util.*;/** * Esta classe implementa equals e hashCode. */classCliente{privateStringnome="";privateStringendereco="";publicCliente(StringpNome,StringpEndereco){nome=pNome;endereco=pEndereco;}publicStringgetNome(){returnnome;}publicvoidsetNome(StringpNome){nome=pNome;}publicStringgetEndereco(){returnendereco;}publicvoidsetEndereco(StringpEndereco){endereco=pEndereco;}publicStringtoString(){return"nome="+nome+", endereco="+endereco;}publicbooleanequals(Objecto){if(!(oinstanceofCliente))returnfalse;if(o==this)returntrue;Clientec=(Cliente)o;// só para simplificar estou supondo que nenhum dos campos é nullreturnnome.equals(c.getNome())&&endereco.equals(c.getEndereco());}publicinthashCode(){intret=nome.hashCode();ret=ret*37+endereco.hashCode();// se houver mais campos, vá repetindo a expressão acima "ret = ret * 37 + hashCode do proximo campo"// por exemplo, ret = ret * 37 + telefone.hashCode();returnret;}}classTestHashSet{publicstaticvoidmain(String[]args){Set<Cliente>clientes=newLinkedHashSet<Cliente>();clientes.add(newCliente("Luis Inacio","Palacio da Alvorada"));clientes.add(newCliente("Fernandinho Beira-Mar","Presidente Bernardes"));clientes.add(newCliente("Fernandinho Beira-Mar","Presidente Bernardes"));// não será repetido - ainda bem!clientes.add(newCliente("Marcos Pontes","Estacao Espacial Internacional"));clientes.add(newCliente("Fernando Henrique Cardoso","Rua Maranhao"));clientes.add(newCliente("Bill Gates","Seattle"));for(Clientecliente:clientes){System.out.println(cliente);}}}
quando uso um iterator para pegar o que está dentro do objeto parametros, eles vêm fora de ordem.
T
thingol
a) “parametros” é um Set de que coisa?
b) Como é que os elementos são adicionados a “parametros”?
ateubh
Estou enviando a classe parâmetros
packagemodel;publicclassSelectBoxParametro{privateStringvalor="NULO";privateStringdescricao="SELECIONE UMA OPÇÃO";privateStringselected="true";publicStringgetValor(){returnvalor;}publicvoidsetValor(Stringvalor){this.valor=valor;}publicStringgetDescricao(){returndescricao;}publicvoidsetDescricao(Stringdescricao){this.descricao=descricao;}publicStringisSelected(){returnselected;}publicvoidsetSelected(Stringselected){this.selected=selected;}publicStringgetSelected(){returnselected;}publicbooleanequals(Objecto){if(!(oinstanceofSelectBoxParametro))returnfalse;if(o==this)returntrue;SelectBoxParametroc=(SelectBoxParametro)o;returnvalor.equals(c.getValor())&&descricao.equals(c.getDescricao())&&selected.equals(c.getSelected());}publicinthashCode(){try{returnnewInteger(valor).intValue();}catch(Exceptione){returnvalor.hashCode();}}}
os dados são adicionados da seguinte forma
lSelectBoxParametro=newSelectBoxParametro();lSelectBoxParametro.setSelected("TRUE");lSelectBoxParametro.setDescricao("<- SELECIONE UMA OPÇÃO ->");lSelectBoxParametro.setValor("0");lSelectBoxParametro.setSelected("TRUE");lParametro.add(lSelectBoxParametro);
T
thingol
Calcule o hashCode direito. Siga o exemplo que lhe dei.
publicinthashCode(){intret=valor.hashCode();ret=ret*37+descricao.hashCode();// se houver mais campos, vá repetindo a expressão acima "ret = ret * 37 + hashCode do proximo campo"// por exemplo, ret = ret * 37 + telefone.hashCode();returnret;}
Agora estou curioso. O que é “ordem” para você?
Que eu saiba, LinkedHashSet deve manter a ordem de inserção (add) dos objetos, quando se usa o Iterator padrão (retornado por “iterator()”) para percorrer os dados.
ateubh
Trocando todos os HashSet por ArrayList funcionou…
O que estava querendo dizer era o seguinte, estou preenchendo combosBox, e o programa insere dados em diversos combos (sempre em ordem alfabetica), mas quando pego esses dados com um iterator, ele me devolve em outra ordem (que não é alfabética).
Antes de substituir os metodos equals e hashcode, ele me devolvia cada hora de um jeito.
De qualquer forma, obrigado pela ajuda.
pcalcado
Você quer uma estrutura ordenada, não uma estrutura que garanta a ordem.
Se você precisa de um set ordenado use uma implementação de SortedSet.
É por isso que em algumas faculdades o pessoal fala “dados sorteados” (é claro que em português isso é incorreto) em vez de falar “dados ordenados”.
sorted = ordenado, tipicamente em ordem lexicográfica (alfanumérica).
ordered = ordenado (pode ser, por exemplo, ordem de inserção).
Putz