Pourquoi ne toString fonction d'une table de hachage imprime lui-même avec un ordre différent?
J'ai cette très simple morceau de code, et j'ai juste essayé de jouer un peu avec les différents type d'objets à l'intérieur d'une Carte.
//There's a bit of spanish, sorry about that
//just think 'persona1' as an object with
//a string and an int
Map mapa = new HashMap();
mapa.put('c', 12850);
mapa.put(38.6, 386540);
mapa.put("Andrés", 238761);
mapa.put(14, "Valor de 14");
mapa.put("p1", persona1);
mapa.put("Andrea", 34500);
System.out.println(mapa.toString());
Puis-je attendre de la console quelque chose comme:
{c=12850, 38.6=386540, Andrés=238761, 14=Valor de 14, p1={nombre: Andres Perea, edad: 10}, Andrea=34500}
Mais susprisingly pour moi j'ai eu les mêmes données dans un ordre différent:
{38.6=386540, Andrés=238761, c=12850, p1={nombre: Andres Perea, edad: 10}, Andrea=34500, 14=Valor de 14}
Ce n'est pas grave si j'ai essayer d'autres types d'objets, même pour les Chaînes ou les types numériques, il le fait toujours la même chose, il fait un autre sans-paraît-il-tout-le sens de l'ordre.
Quelqu'un peut me donner un indice pourquoi cela se produit? Ou peut-être quelque chose de trop évident que je suis absent?
Je suis à l'aide de Java 1.7 et Eclipse Juno.
en interne, il utilise le tableau pour stocker les valeurs et ces valeurs sont insérées à l'indice calculé par une fonction de hachage qui convertit la clé de l'index..Donc l'ordre serait de changer en fonction de la clé.
c'est un beau morceau de l'info, je vais essayer quelques-uns des changements pour voir comment il réagit
c'est un beau morceau de l'info, je vais essayer quelques-uns des changements pour voir comment il réagit
OriginalL'auteur unmultimedio | 2013-09-13
Vous devez vous connecter pour publier un commentaire.
Comme par Oracle documentation
Reportez-vous à HashMap Javadoc.
Pensez que vous êtes le hachage de vos éléments, alors, vraiment, pour un ensemble donné d'éléments {a, b, c}, vous êtes à l'aide de leur hashcodes de hachage({a, b, c}), qui n'ont rien à voir avec l'ordre que vous avez entré les éléments {a, b, c}
mais vous ne pouvez pas prédire la valeur de hachage de chacun des éléments ajoutés à la Carte et d'un seau dans lequel elles sont stockées. Au cours de toString, il va scanner tous les compartiments de A à Z et les éléments d'impression de A à Z seau de l'ordre.
C'est correct. Je viens de remarquer qu'il y existe une unique commande d'impression pour un ensemble de éléments et un déterministe hashmap (ce qui est fait dans le cas de java), et qu'il dépend de la fonction de hachage, et pas de l'ordre d'insertion. Mais encore, tous les ordres d'insertion, l'un d'eux est le même que l'ordre d'impression. La chance de choisir au hasard, elle est donnée par 1/n! où n est le nombre d'éléments, et de ! est factoriel
OriginalL'auteur Vimal Bera
Il y a 3 classe qui implémente l'interface de carte en java.
1. hashMap: Id ne permet pas de garantir n'importe quel ordre.
2. Lié HashMap:Il va les stocker dans l'ordre d'insertion.
3. TreeMap: Il va stocker dans l'ordre croissant.(Valeur ASCII)
Donc, selon vos besoins, vous pouvez utiliser la table de hachage Liée au lieu de la table de hachage.donc au lieu d'écrire
créer un objet de la table de hachage Liée
suivez ci-dessous le lien pour plus d'info.
http://docs.oracle.com/javase/tutorial/collections/interfaces/map.html
OriginalL'auteur Anuj Kumar Jha
HashMap pas garanti l'ordre de l'élément. Si vous voulez garder votre commande, utilisez LinkedHashMap.
Voir la suite de cas
De sortie:
HashMap
ne pas trier les entrées par des touches.OriginalL'auteur Ruchira Gayan Ranaweera
Des cartes ne permet pas de maintenir l'ordre l'ordre dans lequel les éléments ont été ajoutés, Liste de maintenir l'ordre des éléments
"L'ordre d'une carte est définie comme l'ordre dans lequel les itérateurs sur la carte de vues de la collection retour de leurs éléments. Certaines implémentations, comme le TreeMap classe, apporter des garanties quant à leur ordre; d'autres, comme la table de hachage de la classe, ne le font pas."
OriginalL'auteur upog
C'est ainsi qu'une table de hachage de travaux: (en citant une autre source)
Il a un certain nombre de "seaux", qu'elle utilise pour stocker des paires clé-valeur. Chaque compartiment dispose d'un numéro unique - c'est ce qui identifie le seau. Quand vous mettez une paire clé-valeur dans la carte, la table de hachage va regarder le code de hachage de la clé, et de stocker la paire dans le seau dont l'identificateur est le code de hachage de la clé. Par exemple: Le code de hachage de la clé est de 235 -> la paire est stocké dans un seau numéro 235. (À noter qu'un compartiment peut stocker plus d'une paire clé-valeur).
Lorsque vous recherche une valeur dans la table de hachage, en lui donnant une touche, il va d'abord regarder le code de hachage de la clé que vous avez donné. La table de hachage va ensuite chercher dans le seau, puis il compare la clé qui vous a donné les clés de toutes les paires dans le seau, en les comparant avec equals().
Maintenant, vous pouvez voir comment cela est très efficace pour la recherche de paires clé-valeur dans une carte: par le code de hachage de la clé de la table de hachage sait immédiatement où seau à regarder, de sorte qu'il n'a qu'à tester par rapport à ce qui est dans le seau.
Regardant le mécanisme ci-dessus, vous pouvez également voir quelles sont les conditions nécessaires sur la
hashCode()
etequals()
méthodes de touches:Si les deux touches sont les mêmes (equals() renvoie la valeur true lorsque vous comparez entre eux), leur hashCode() la méthode doit renvoyer le même nombre. Si les touches de violer la présente, ensuite, les clés de l'égalité peuvent être stockées dans des compartiments différents, et la table de hachage ne serait pas en mesure de trouver des paires clé-valeur (parce qu'il va dans le même seau).
Si les deux clés sont différentes, alors il n'a pas d'importance si leurs codes de hachage sont les mêmes ou pas. Ils seront stockés dans le même seau si leurs codes de hachage sont les mêmes, et dans ce cas, la table de hachage va utiliser equals() pour les distinguer.
Maintenant, quand vous mettez tous votre "clé-valeur" paires dans la table de hachage, et de les imprimer, imprime dans un ordre aléatoire des clés qui a été générée par le hachage de la valeur vous fourni pour les clés.
Si votre exigence est encore de maintenir la commande, vous pouvez utiliser le
LinkedHashMap
en Java.Espère que cela aide 🙂
Edit: Message Original: Comment un Java HashMap de gérer les différents objets avec le même code de hachage?
OK. J'ai l'habitude de faire, mais je l'ai raté. Mais, un downvote pour qui? :-/
Non, c'est du copier-coller l'intégralité du post au lieu de les résumer et d'inclure un lien.
OriginalL'auteur VictorCreator