[RESOLVIDO] Problemas com o Set / HashSet

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]);
    }

Troquei pelo LinkedHashSet e continuou o msm erro man…

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

só trocando o LinkedHashSet nao funcionou tbm, mas vc falou de nao esquecer os metodos equals e hashcode em partido, precisa disso ? se sim como funciona ? achei q o Set fazia a comparacao pra saber se existe algum igual automaticamente e nao q precisaria de um metodo manual pra isso

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().