To tentando usar o Set / HashSet em um exercicio da faculd pra POO, a ideia principal pra usar ele no programa é nao permitir instancias iguais no array, declarei na classe o array usando “private Set listaPessoas = new HashSet();” , porem quando testei no main adicionando dois objetos diferentes e um igual no array ele simplismente adicionou os 3 ( tirando a utilidade de nao permitir objetos iguais )
como resolver isso ?E ae
Use LinkedHashSet.
LinkedHashSet seuSet = new LinkedHashSet();
seuSet.add("001");
seuSet.add("001");
seuSet.add("002");
seuSet.add("003");
seuSet.add("005");
seuSet.add("003");
for (int i = 0; i < seuSet.size(); i++) {
System.out.println(seuSet.toArray()[i]);
}
Veja o que lhe passei
LinkedHashSet seuSet = new LinkedHashSet();
E como você fez
private Set<Partido> listaPartidos = new LinkedHashSet<Partido:();
Logo
private LinkedHashSet<Partido> listaPartidos = new LinkedHashSet<Partido>();
Não esqueça de implementar os metodos equals e hashCode emk Partido
Isso. Deve implementar eles.
Veja (Dúvida sobre HashSet e LinkedHashSet).
Vá na sua classe Partido, botão direito => Source => Generate HashCode and Equals.
Pense o seguinte. Você não está comparando atributos primitivos (int, String) está comparando Objetos que terão inúmeros atributos.
Como saber se você vai estar comparando o nome objeto? Se tiver um atributo nome ele vai comparar e ver se já existe no seu Set algum outro objeto com este nome? E se for idade? endereço?
Em suma, é nestes métodos que você poder dizer quem será comparado.
Tem algumas teorias a mais ai.
Mas entendendo isso você já vai ter uma boa noção.
Tente implementar e testar
Um pouco de teoria:
Apenas o equals pode determinar se dois objetos são iguais, porem o hashCode tem o papel de exclusão, para que 2 objetos sejam iguais, eles precisam ter o mesmo hashCode, porem nem todos objetos de mesmo hashCode são iguais…
equals gerado pelas IDEs costumam usar como um dos critérios o objeto Class da própria classe, isso é ruim, pois dentro dos princípios SOLID isso quebra o “Liskov substitution principle”.
Como implementar equals:
http://www.staroski.com.br/2014/10/05/equals-utils/
Como implementar hashCode:
http://www.staroski.com.br/2014/10/06/hashcode-utils/
Utilizando padrão Strategy para computar equals e hashCode:
http://www.staroski.com.br/2014/10/07/equality-strategy/
Pelo que entendo nao tem como você fazer as 3 coisas ao mesmo tempo: manter o contrato do equals/hashcode, usar herança e manter o princípio de Liskov. Qual seria a soluçao para isso?
Ao sobrescrever uma classe sem incluir novos atributos ou incluindo apenas atributos que não interfiram no cálculo do equals
e hashCode
, essa subclasse atenderá ao princípio da substituição de Liskov de tal forma que um objetoClasse.equals(objetoSubclasse)
seja true
.
Mas, só vai funcionar se o equals da superclasse utilizar a comparação com instanceof
ao invés de getClass()
.