2009-12-28 4 views
3

J'ai plusieurs ensembles qui stockent les objets de la même classe, mais je veux spécifier une fonction d'identité différente pour chacun d'entre eux (par exemple, dans un ensemble A == B si Axe == Bx, tandis que dans un autre A == B si Ay == By).Définition de plusieurs fonctions de hachage pour le même objet

Actuellement j'utilise TreeSets avec différents comparateurs définis pour chacun. Je me demande comment la même chose peut être faite si je veux passer à HashSets. Java ne permet pas de passer une fonction de hachage séparée de la même manière que les comparaisons pour les collections triées/arborescentes. La seule façon de le faire serait de créer une classe wrapper différente et d'implémenter la méthode hashCode() dans chacun des éléments de chaque HashSet. Existe-t-il une meilleure façon de le faire?

Répondre

2

Vous pouvez essayer d'utiliser THashSet dans GNU Trove, Cela prend en charge plusieurs stratégies de hachage.

7

Que diriez-vous de créer des sous-classes séparées pour chaque ensemble. La seule différence pour chaque sous-classe serait la fonction de hachage substituée qui répond à vos critères.

+3

Vous pouvez implémenter les sous-classes en tant que classes internes privées et fournir une méthode usine pour obtenir la sémantique d'égalité souhaitée. Ceci encapsule complètement le choix – Andrew

3

Je ne suis pas au courant d'une meilleure façon de le faire. Votre solution proposée (classes wrapper avec une logique de comparaison différente) semble très raisonnable.

Vous avez mentionné l'implémentation de la méthode hashCode - n'oubliez pas d'implémenter également equals.

2

Il y a une autre option: Vous pouvez copier la source pour HashMap et remplacer la méthode hash(Object key) avec quelque chose d'autre (par exemple, un appel à un Hasher qui fonctionne comme le Comparator du TreeMap).

+0

. N'oubliez pas d'implémenter l'interface de collection. – Bozho

+0

Merci. Je suppose que c'est la meilleure chose à faire. J'accepte la réponse de Peter Lawry puisqu'il suggère d'utiliser une implémentation standard plutôt que de coder la mienne. – MAK

Questions connexes