Oi, uma dúvida que não estou conseguindo sanar:
Tenho uma classe, por exemplo, Pessoa.
Ela tem ID e Nome.
No momento de inserção no HashSet, quero que o Set considere como duplicata tando pelo ID quanto pelo Nome. Tentei de várias maneiras sobrescrever os equals e HasCode.
Mesmo assim não consegui.
Gostaria que me ajudassem.
Obrigado.
a) Se fosse um banco de dados, sua chave primária seria “ID” ou “ID + Nome” ou “Nome”?
b) Você não pode sobreescrever o método “put” ?
Cara, voce tem que criar um atributo composto pelo Id e pelo nome de cada Pessoa tal que garanta a unicidade de cada objeto. Outra coisa, para implementar a funcionalidade que voce deseja voce tera que implementar a interface Comparable. Veja a seguir:
public class Pessoa implements Comparable{
private Integer id;
private String nome;
public boolean equals(Object o){
return o != null && o instanceof Pessoa && this.getChaveIdentificacao().equals(((Pessoa)o).getChaveIdentificacao());
}
public int hashCode(){
return this.id != null && this.nome != null ? this.getChaveIdentificacao().hashCode() : -1;
}
public String getChaveIdentificacao(){
return this.id+this.nome;
}
@Override
public int compareTo(Object o) {
Pessoa pessoa = (Pessoa) o;
return this.id != null && this.nome != null ? this.getChaveIdentificacao().compareTo(pessoa.getChaveIdentificacao()): -1;
}
}
Pois dessa forma voce podera ordernar seus objetos utilizando um TreeSet.
T+
[quote=Vini Fernandes]Cara, voce tem que criar um atributo composto pelo Id e pelo nome de cada Pessoa tal que garanta a unicidade de cada objeto. Outra coisa, para implementar a funcionalidade que voce deseja voce tera que implementar a interface Comparable. Veja a seguir:
public class Pessoa implements Comparable{
private Integer id;
private String nome;
public boolean equals(Object o){
return o != null && o instanceof Pessoa && this.getChaveIdentificacao().equals(((Pessoa)o).getChaveIdentificacao());
}
public int hashCode(){
return this.id != null && this.nome != null ? this.getChaveIdentificacao().hashCode() : -1;
}
public String getChaveIdentificacao(){
return this.id+this.nome;
}
@Override
public int compareTo(Object o) {
Pessoa pessoa = (Pessoa) o;
return this.id != null && this.nome != null ? this.getChaveIdentificacao().compareTo(pessoa.getChaveIdentificacao()): -1;
}
}
Pois dessa forma voce podera ordernar seus objetos utilizando um TreeSet.
T+[/quote]
Entendi.
Mas nesse caso, só será duplicata se o Nome e ID for igual não é?
Tipo
Nome: Joao - ID: 5
Nome: Joao - ID: 5
Esses dois seriam considerado iguais.
O que eu precisava era assim :
Nome: Joao - ID: 210
Nome: Joao - ID 820
Nome: Pedro - ID: 210
Nesse caso todos deviam ser tratados como igual, já que ou tem mesmo nome, ou mesmo ID.
Será que é possível?
você reparou que neste exemplo que deu, a quantidade de registros no set vai depender da ordem de entrada dos dados?
se inserir nesta ordem: (210,João), (820,João), (210, Pedro)
terá apenas 1 registro no final ( o que você quer)
se inserir nesta ordem: (820,João), (210, Pedro), (210,João)
terá 2 registros no final…
é pra funcionar assim mesmo?
para funcionar do jeito que você quer com um HashSet você precisa:
- que o hashCode retorne um valor constante (pois ele deve ignorar id e nome), o que é não é uma boa prática
- que o equals teste com OR no lugar de AND, qualquer atributo igual já retorna true;