10
votes

Comment utiliser deux nombres comme clé de carte

J'ai deux chiffres et je veux les utiliser ensemble comme une clé dans une carte code>. Actuellement, je concatérai leurs représentations de chaîne. Par exemple, supposons que les numéros de clé sont 4 et 12. J'utilise:

String key = 4 + "," + 12;


1 commentaires

Je pense que la chaîne délimitée par des virgules est une bonne idée. J'utilise cette approche tout le temps.


8 Réponses :


17
votes

Créer un objet qui détient les deux numéros et l'utiliser comme clé. Par exemple: xxx

Si vous préférez une approche mathématique, voir cette scaleverflow répond .


7 commentaires

Merci, votre très bonne méthode, mais je ne veux pas utiliser de "classe" pour résoudre le problème. Comment utiliser les méthodes mathématiques ordinaires pour obtenir une clé? Je demande seulement, "le plus rapide"


D'ACCORD. J'ai ajouté un lien vers la réponse que vous voulez :-)


OK - c'est donc maintenant assez clairement un problème de devoirs. La solution correcte est ici pour utiliser une classe. La mise en œuvre de la méthode HashCode () de cette classe est l'endroit où la performance entre en jeu.


Voulez-vous vraiment que X et Y soient mutables si vous utilisez ceci comme clé de hashmap?


De plus, si vous devez rechercher des trucs de votre carte, et non seulement itérer sur elle, vous devriez remplacer les méthodes Hashcode () et égaux (). Cela vous permettra de: A Créer des objets coordonnées à un moment futur et récupérer des choses de votre carte déjà peuplée. Sinon, même si vous créez des coordonnées avec les mêmes x et Y en tant que coordonnées utilisées comme clé dans la carte, vous ne serez pas retourné la valeur. B Il améliorera le temps de recherche de votre carte


Mais, je suppose que la question est toujours de savoir comment implémenter la méthode HashCode () alors?


Cette solution a-t-elle une complexité theta (1)? Je suppose que la carte en Java est comme la carte de C ++ dont la complexité de la recherche d'un élément est thêta (logn).



-5
votes

Vous avez besoin d'écrire les méthodes de droite et de code HASHCODE, ou de produire des bugs.


0 commentaires

6
votes

Vous pouvez stocker deux entiers dans un long comme celui-ci, xxx

ou vous pouvez utiliser la paire suivant classe, < Pré> xxx


4 commentaires

Je parviendrais ceci pour la solution de Nifty Int -> Longue Solution, mais je levais également pour avoir rendu le paire mutable.


Vous ne pouvez pas utiliser les primitives comme paramètres génériques.


Bonne truc, mais j'ai du mal à extraire ces deux entiers de celui-là une longue une fois qu'ils sont stockés là-bas. Quelles opérations de bits pouvez-vous utiliser pour tirer ces deux entiers (R et L)?


Le hashcode avec être le même pour (1,2) et (2,1)



10
votes

Si vous allez avec la solution d'objet, Assurez-vous que votre objet clé est immuable .

Sinon, si quelqu'un dépourle la valeur, non seulement cela ne sera plus égal à l'autre apparemment identique. Les valeurs, mais le hashcode stocké sur la carte ne correspondra plus à celui retourné par la méthode HashCode () . À ce point, vous êtes essentiellement SOL.

Par exemple, en utilisant java.awt.point - quel looks, sur papier, comme exactement quoi Vous voulez - les suivants: xxx

impressions: xxx


0 commentaires

0
votes

Une autre approche serait d'utiliser des cartes imbriquées: xxx

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 correctement les entrées et vous devez toujours modifier les accès pour trouver l'objet que vous recherchez.


0 commentaires

0
votes

Pourquoi devriez-vous écrire tout ce code supplémentaire pour effectuer une classe épouse complète que vous n'avez pas besoin pour que rien d'autre soit meilleur que d'utiliser une chaîne simple? Calculera le code de hachage pour des instances de cette classe être beaucoup plus rapide que pour la chaîne? Je ne le pense pas.

sauf si vous courez dans un environnement d'alimentation informatique extrêmement limité, les frais généraux de fabrication et de hachage ne doivent pas être sensiblement plus grands que celui de l'instanciation de votre classe personnalisée.

Je suppose que le moyen le plus rapide serait de simplement emballer les INT en une seule longue carrée ZZ suggérée, mais dans tous les cas, je ne m'attends pas à ce que les gains de vitesse soient substantiels.


0 commentaires

1
votes

Une réponse pratique à ces questions est la suivante:

hashCode = a + b * 17;


0 commentaires

15
votes

Vous devez utiliser java.awt.dimension comme clé.

clé de dimension = nouvelle dimension (4, 12); p>

Dimension a une méthode de hashcode de très belle () qui produit un crash de hashcode différent pour chaque paire de nombres entiers positifs, de sorte que les hachons pour (4, 12) et (12, 4) sont différents. Donc, ceux-ci sont rapides pour instancier et faire de très bons hachons de hashcodes. P>

Je souhaite qu'ils avaient rendu la classe immuable, mais vous pouvez faire votre propre classe immuable modélisée sur la dimension. p>

Voici une table montrant le casquette pour différentes valeurs de largeur et de hauteur: P>

static int hashKeyFromPair(short a, short b) {
  assert a >= 0;
  assert b >= 0;
  long sum = (long) a + (long) b;
  return (int) (sum * (sum + 1) / 2) + a;
}


1 commentaires

Pour le curieux, la fonction utilisée dans cette réponse s'appelle le Fonction de couplage Cantor .