Comment utiliser un ensemble d’éléments comme clé dans des cartes Java?

Je veux stocker une valeur basée sur une clé, composée d’un ensemble d’éléments. Quelque chose comme l’exemple ci-dessous. Bien sûr, je sais que mon pseudo-exemple ne fonctionnerait pas, car le hachage de l’object sera probablement son adresse qui sera unique pour chaque nouvelle instance, indépendamment de son contenu.

// in this pseudo-example this is my SET http://algs4.cs.princeton.edu/35applications/SET.java.html // but the idea is that values are unique HashMap<SET, Ssortingng> map = new HashMap(); SET a = new SET(); a.add(1); a.add(2); a.add(5); SET b = new SET(); b.add(5); b.add(1); b.add(2); map.put(a, "w00t"); System.out.println(map.get(b)); // I would want to get "w00t" because my key is the same set of elements 

Bien sûr, je peux simplement sortinger et concaténer les valeurs SET en tant que chaîne, avec un séparateur et l’utiliser dans une HashMap , mais cela ne me semble tout simplement pas correct. Je suis assez nouveau dans la programmation Java, il pourrait donc y avoir une solution évidente qui me manque.

Si vous utilisez HashSet au lieu de votre SET personnalisé (je suppose que c’est une classe personnalisée), cela fonctionnerait très bien, puisque HashSet écrase hashCode et equals (pour être exact, HashSet étend AbstractSet qui écrase ces méthodes), il peut servir de clé dans une HashMap .

Cependant, si vous modifiez un ensemble qui sert de clé dans votre carte, vous ne pourrez pas localiser cette clé ultérieurement dans la carte. C’est le risque que vous courez lorsque vous utilisez des objects mutables comme clés dans une carte de hachage.

 HashMap, Ssortingng> map = new HashMap, Ssortingng>(); HashSet a = new HashSet(); a.add(1); a.add(2); a.add(5); HashSet b = new HashSet(); b.add(5); b.add(1); b.add(2); map.put(a, "w00t"); System.out.println(map.get(b)); 

Cette sortie w00t .

Créez une classe de collection et substituez hashcode () de manière à ce que le même hashcode soit renvoyé pour différentes instances de collection ayant le même contenu. Vous pouvez simplement remplacer la méthode dans une classe dérivée de votre collection souhaitée. Vous devez également réimplémenter égal à (Object o).

Cela dépend de l’implémentation de la classe SET. Vous pouvez étendre la classe java.util.HashSet ou implémenter les méthodes equals() et hashCode() dans votre classe SET. Toute solution fonctionnera.

Vous n’avez pas ajouté l’ensemble b à votre carte. Ajoutez d’abord les deux ensembles, puis essayez d’obtenir une valeur associée à la clé b .