Comment utiliser deux numéros d'une Carte-clé
J'ai deux numéros et je veux les utiliser ensemble, comme une clé dans une Map
. Actuellement, je suis de la concaténation de leurs représentations de chaîne. Par exemple, supposons que les numéros 4 et 12. J'utilise:
String key = 4 + "," + 12;
La carte est déclarée comme Map<String, Object>
.
Je pense que c'est tellement mauvais! J'aime utiliser autre chose qu'un String
comme la clé! Je veux le moyen le plus rapide pour créer ces clés.
Qui a une bonne idée?
Je pense que la Chaîne délimitée par des virgules est une bonne idée. J'utilise cette approche, tout le temps.
OriginalL'auteur Koerr | 2009-09-16
Vous devez vous connecter pour publier un commentaire.
Créer un objet qui contient les deux nombres et de l'utiliser comme clé. Par exemple:
Si vous préférez une approche mathématique, voir cette StackOverflow répondre.
OK. J'ai ajouté un lien vers la réponse que vous voulez 🙂
ok - donc, c'est maintenant assez clairement d'un problème. Le correct la solution c'est d'utiliser une classe. La mise en œuvre de la hashcode() la méthode de cette classe est l'endroit où la performance est en jeu.
Voulez-vous vraiment x et y mutable si vous êtes en utilisant cela comme une table de hachage de la clé?
Bon point. Fixe.
OriginalL'auteur SingleShot
Vous devez utiliser java.awt.Dimension de votre clé.
Clé de Dimension = new Dimension(4, 12);
Dimension a une très belle hashCode() méthode qui produit un autre hashCode pour chaque paire de nombres entiers positifs, de sorte que les hashCodes (4, 12) et (12, 4) sont différentes. De sorte que ces sont rapides à instancier et de très bonnes hashCodes.
Je ne souhaite qu'ils avaient fait la classe immuable, mais vous pouvez faire votre propre immuable classe calquée sur la Dimension.
Voici un tableau montrant le hashCode pour différentes valeurs de la largeur et de la hauteur:
Si vous suivez les hashCodes dans l'ordre de 0 à 14 ans, vous verrez le modèle.
Voici le code qui produit cette hashCode:
On peut reconnaître la formule pour les nombres triangulaires à l'intérieur de la dernière ligne. C'est pourquoi la première colonne du tableau contient tous les nombres triangulaires.
Pour la vitesse, vous devez calculer le hashCode dans le constructeur. Donc, l'ensemble de votre classe pourrait ressembler à ceci:
Bien sûr, si vous aurez probablement besoin d'une méthode equals, mais vous vous limitez à des entiers positifs qui ne débordera pas, vous pouvez ajouter un très rapide:
Nous restreindre à des valeurs positives, car les valeurs négatives produisent une certaine dupliqué des codes de hachage. Mais avec cette restriction en place, ce sont les plus rapides hashCode() et equals() les méthodes qui peuvent être écrits. (Bien sûr, vous pouvez écrire hashCodes tout aussi rapidement dans toute immuable de la classe par le calcul de la hashCode dans le constructeur.)
Si vous ne pouvez pas vivre avec ces restrictions, vous avez juste besoin de sauvegarder les paramètres.
Mais voici le kicker. Vous n'avez pas besoin de cette classe. Depuis la formule vous donne un entier unique pour chaque paire de nombres, vous pouvez l'utiliser Entier comme votre carte de clés. L'Entier de la classe a sa propre rapide equals() et hashCode méthodes qui fonctionnent bien. Cette méthode permettra de générer la clé de hachage à partir de deux valeurs courtes. La seule restriction est que les entrées doivent être positifs à court de valeurs. C'est la garantie de ne pas déborder, et en jetant l'intermédiaire somme pour un long, il a une gamme plus large que la méthode précédente: Il fonctionne avec tous les résultats positifs à court de valeurs.
OriginalL'auteur MiguelMunoz
Si vous allez avec l'objet de la solution, assurez-vous que votre objet clé est immuable.
Sinon, si quelqu'un mute de la valeur, non seulement il n'est plus égal à d'autres, apparemment-des valeurs identiques, mais le hashcode stockées dans la carte n'est plus correspondre à celui retourné par la
hashCode()
méthode. À ce stade, vous êtes fondamentalement SOL.Par exemple, à l'aide de
java.awt.Point
-- qui ressemble, sur le papier, comme exactement ce que vous voulez -- les suivantes:imprime:
+1,merci,d'ailleurs,que signifie "SOL"?
Voir urbandictionary.com/define.php?term=S.O.L.
OriginalL'auteur David Moles
Vous pouvez stocker deux entiers dans un long comme ça,
Ou vous pouvez utiliser la suite
Pair<Integer, Integer>
classe,Pair
mutable.Vous ne pouvez pas utiliser les primitives comme des paramètres génériques.
Oups! Corrigés. Merci!
Tour de Nice, mais je vais avoir de la difficulté à l'extraction de ces deux nombres entiers à partir de ce long une fois qu'ils y sont stockées. Ce que les opérations sur les bits que vous pouvez utiliser pour tirer ces deux entiers (r et l)?
Le hashCode avec être le même pour (1,2) et (2,1)
OriginalL'auteur ZZ Coder
Une réponse pratique à cette question est:
... où a, b et hashCode sont tous des entiers. 17 est juste l'arbitraire d'un nombre premier. Votre hash ne sera pas être unique, mais c'est OK. Ce genre de chose est utilisé partout dans le Java de la bibliothèque standard.
OriginalL'auteur cbare
Une autre approche serait d'utiliser imbriquée cartes:
Ici, vous n'avez pas de frais généraux pour créer des clés. Cependant, vous avez plus de frais généraux pour créer et récupérer des entrées correctement et vous devez toujours à la carte-accès pour trouver l'objet que vous recherchez.
OriginalL'auteur Wolfgang
Pourquoi devrais écrire tout ce qui code supplémentaire pour faire une véritable classe que vous n'avez pas besoin de rien d'autre de mieux que l'utilisation d'une simple Chaîne de caractères? Va de calcul le code de hachage pour les instances de cette classe d'être beaucoup plus rapide que pour la Chaîne? Je ne le pense pas.
Sauf si vous exécutez dans un extrêmement limitée de la puissance de calcul de l'environnement, les frais généraux de fabrication et de hachage Chaînes ne devraient pas être sensiblement plus grand que celui de l'instanciation de votre classe personnalisée.
Je suppose que le moyen le plus rapide serait de tout simplement pack les services de renseignements en un seul Longtemps que ZZ Codeur proposé, mais en tout cas, je ne m'attends pas le gain de vitesse considérable.
OriginalL'auteur MAK
Vous avez besoin d'écrire le droit eqauls et hashcode méthodes , ou de produire certains bugs.
OriginalL'auteur Peter Lee