À l'aide de deux (ou plus) objets comme une table de hachage de la clé
Je veux stocker certains objets dans une table de hachage. Le problème est, en général, vous utilisez simplement un objet unique, comme une clé. (Vous pouvez, par exemple, utiliser une Chaîne de caractères.) Ce que je veux faire à l'utilisation de plusieurs objets. Par exemple, une Classe et d'une Chaîne. Est-il simple et propre pour le mettre en œuvre?
OriginalL'auteur Gambler | 2009-07-27
Vous devez vous connecter pour publier un commentaire.
Vous, la clé doit mettre en œuvre le hashCode et equals. Si c'est un SortedMap, il doit également implémente l'interface Comparable
OriginalL'auteur Pierre
J'ai tendance à utiliser une liste
Non, le hashcode de toute
List
(ou au moins toutAbstractList
, quiArrays.asList
est) est déterminée par la hashcodes de ses éléments. J'ai juste regardé parce que j'ai eu la même pensée.Facile à faire, mais il a l'inconvénient de ne pas documenter ce qui appartient à la liste. C'était classe, la chaîne ou la chaîne? ou celui de la classe et de la chaîne?
Vrai, mais il ya des façons que vous pouvez gérer cela, comme la création d'une statique getHashList méthode qui le fera pour vous. Aussi, je vous recommanderais certainement la Pierre de Touche de Classe pour plus vécu des cartes.
Un autre problème est que les implémentations de hashCode et equals dans la liste sont cher par rapport à un bien mis en œuvre en classe personnalisée.
OriginalL'auteur ILMTitan
La façon la plus simple que je connaisse est de faire une classe wrapper et remplacer hashmap et égaux. Par exemple:
Bien sûr, je vous conseille d'utiliser un StringBuilder et tout le reste, mais de cette façon, vous avez remplacé la equals et hashcode, permettant ainsi une table de hachage et de l'égalité de vérifier sur votre touches multiples.
Aussi, je vous recommande d'en faire les objets immuables (non modifiables) pour des raisons de sécurité, mais c'est purement de préférence.
OriginalL'auteur aperkins
Apache Commons Collections a un multikey carte qui pourrait faire l'affaire pour vous:
https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/keyvalue/MultiKey.html
On dirait qu'il va gérer jusqu'à 5 "clés".
OriginalL'auteur Clay Mitchell
Voulez-vous dire que l'objet est identifié par les deux touches, ou plutôt d'une clé qui se compose de deux choses.
Si vous voulez le premier cas. C'est une objection identifié par les deux touches, dire d'une classe ou d'un objet, vous devez utiliser deux cartes.
Dans le second cas, vous avez besoin d'une carte de cartes, donc:
OriginalL'auteur Ethan Heilman
Vous pouvez créer un titulaire de la classe qui contient la classe et de la chaîne que vous souhaitez en clés.
Probablement pas la meilleure solution, mais une possibilité.
J'aime l'approche, mais l'ajout d'un hashcode et equals méthode est mandantory pour le cas d'utilisation. Je voudrais également rendre immuable.
et @Jens Schauder, merci pour les pointeurs.
OriginalL'auteur Berek Bryan
Il y a quelques endroits où les gens suggèrent la création d'une "Clé" de la classe contenant les autres, je suis totalement d'accord. Juste pensé que je voudrais ajouter un truc utile.
Si vous utilisez eclipse ou netbeans, ils ont une belle option--vous pouvez indiquer à Eclipse pour créer equals et hashcode des méthodes basées sur un ou plusieurs membres. Donc, il vous suffit de sélectionner les membres (ou membres) vous souhaitez récupérer par et NB crée plus de code que vous auriez besoin d'écrire pour vous.
bien sûr, quand je veux juste récupérer par un objet, je l'ai souvent juste déléguer le hashcode et equals méthodes de l'objet (avec délégation est égal pourrait être problématique car cela voudrait dire que l'un de vos "porte-Clés" les classes serait égal à l'objet qu'en est-il de la clé, mais c'est assez facilement résolu (et ne serait généralement pas l'effet de quelque chose de toute façon)
donc, hors de ma tête:
C'est tout là est à lui, et eclipse va faire les deux derniers pour vous si vous le demandez.
Par la manière, je sais que j'ai des membres du public, un public dernier membre est exactement la même chose que d'avoir un getter--pas vraiment une idée terrible. Je commence à utiliser ce modèle sur les petites classes utilitaires comme ce beaucoup plus récemment. Si le membre n'était pas définitive, elle serait pire, car ce serait comme avoir un setter (Chose que j'essaie d'éviter ces jours-ci).
OriginalL'auteur Bill K
On peut résoudre ce problème à l'aide d'apache commons collection lib du
MultiKey
de la classe.Voici un exemple simple:
OriginalL'auteur Asraful Forhad Chowdhury