Remover duplicata baseado em um dos atributos - HashSet[RESOLVIDO]

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;