Est-il un moyen de récupérer la valeur d'une HashMap au hasard en Java?
Est-il un moyen de récupérer la valeur d'une HashMap au hasard en Java?
- Pourquoi avez-vous besoin de cela? Si c'est autre chose que du test, vous utilisez la mauvaise structure de données. Si c'est pour le test, vous ne voulez probablement pas de données aléatoires.
- Voir ma réponse ci-dessous -- la manière appropriée de le faire, cela dépend un peu de votre situation (notamment la manière dont de nombreux éléments aléatoires vous avez besoin par le changement de la carte).
- Si vous voulez quelque chose d'efficace, de prendre un coup d'oeil à ma réponse: stackoverflow.com/questions/9919734/... tables de hachage sont, en principe, une grande structure pour l'accès à des éléments aléatoires. Il est malheureux que l'api Java ne nous donne pas un moyen facile de le faire.
- salut, je sais que c'est un vieux thread, mais je me demande pourquoi vous dites sa la mauvaise structure de données pour un accès aléatoire? Merci
- HashMaps sont conçus pour être accessibles par la touche plutôt que de valeur. Il y a utilise pour bidirectionnelle mappages, mais vous devez choisir une classe conçu à cet effet et de ne pas essayer la force HashMap à faire quelque chose qu'il n'a pas été conçu pour faire.
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne:
Si vous voulez que la valeur aléatoire être d'un type autre qu'un
Object
simplement ajouter un plâtre à la dernière ligne. Donc, simyHashMap
a été déclaré que:La dernière ligne peut être:
Ci-dessous ne fonctionne pas,
Set.toArray()
retourne toujours un tableau deObject
s, qui ne peuvent pas être contraints à un tableau deMap.Entry
.toArray(T[] arr)
méthode,Map.Entry<K, V>[] entries = s.entrySet().toArray(new Map.Entry[s.size()]);
(vous devez avoir un avertissement, mais parce que vous ne pouvez pas créer un paramétrés au tableau)toArray(T[])
avec une taille de 0 tableau pour éviter une fonte.Puisque les conditions ne demande pour une valeur aléatoire à partir de la
HashMap
, voici la démarche:HashMap
a unvaleurs
méthode qui renvoie uneCollection
des valeurs de la carte.Collection
est utilisé pour créer unList
.taille
méthode est utilisée pour trouver la taille de laList
, qui est utilisé par leAléatoire.nextInt
méthode pour obtenir un aléatoire de l'indice de laList
.List
get
méthode avec l'aléatoire index.Mise en œuvre:
La belle partie de cette approche est que toutes les méthodes sont générique -- il n'est pas nécessaire pour typecasting.
Si vous avez besoin d'attirer plus de valeurs à partir de la carte sans répétition des éléments que vous pouvez mettre la carte dans une Liste et ensuite shuffle il.
Générer un nombre aléatoire entre 0 et le nombre de clés dans votre
HashMap
. Obtenir la clé de la à la de nombre aléatoire. Obtenir la valeur de cette clé.Pseudocode:
Si c'est difficile à mettre en Java, vous pouvez créer et tableau à partir de ce code à l'aide de la
toArray()
fonction dansSet
.Je ne suis pas vraiment sûr de savoir comment faire le nombre aléatoire.
Habituellement, vous ne voulez pas vraiment un aléatoire valeur, mais plutôt juste tout valeur, et puis c'est sympa de faire cela:
Une bonne réponse dépend légèrement sur les circonstances et, en particulier, à quelle fréquence vous devez obtenir une clé aléatoire pour une carte (N. B. la technique est essentiellement le même, si vous prenez la clé ou la valeur).
à partir d'une carte donné, sans la carte
changer entre l'obtention de la
des touches au hasard, puis utilisez le aléatoire
méthode d'échantillonnage que vous parcourez
au moyen de la touche set. Effectivement ce que
vous avez à faire est de faire une itération sur l'ensemble
retourné par keySet(), et sur chaque
item calculer la probabilité de
vouloir prendre que les principaux, compte tenu de la façon dont
beaucoup vous aurez besoin total et le
numéro que vous avez prises jusqu'à présent. Alors
générer un nombre aléatoire et de voir si
ce nombre est inférieur à la
la probabilité. (N. B. Cette méthode fonctionnera toujours, même si vous avez seulement besoin d ' 1 clé, c'est juste pas nécessairement le moyen le plus efficace dans ce cas.)
en pseudo-aléatoire déjà. Dans un
cas extrême où vous seulement
jamais besoin d'une clé aléatoire pour un
étant donné carte, vous pouvez même juste
tirez le premier élément de la
keySet().
besoin de multiples possibilités de clés aléatoires
pour une possible carte ou de la carte
va changer entre vous de prendre aléatoire
les clés de), vous avez pour
de créer ou de maintenir un tableau/liste des clés à partir de laquelle vous sélectionnez un
clé aléatoire.
De le convertir à un tableau et ensuite obtenir la valeur est trop lente lors de son dans la chaleur du chemin.
ainsi obtenir l'ensemble (soit la clé ou keyvalue) et de faire quelque chose comme:
je ne sais vraiment pas pourquoi vous voulez le faire... mais si cela peut aider, j'ai créé un RandomMap automatiquement réinitialise les valeurs lorsque vous appelez les valeurs de(), puis les suivants praticable de démonstration de l'application peut faire le travail...
Voici un exemple comment utiliser les tableaux approche décrite par Peter Stuifzand, également par le biais de la
values()
-méthode:J'ai écrit un utilitaire pour récupérer aléatoire d'une entrée, d'une clé ou d'une valeur à partir d'une carte, d'entrée de jeu, ou de l'itérateur.
Puisque vous ne peut pas et ne doit pas être en mesure de déterminer la taille d'un itérateur ( La goyave peut le faire ), vous devez surcharger la
randEntry()
méthode d'accepter une taille qui devrait être la longueur de la liste des entrées.Cela dépend de ce que votre clé est la nature d'une table de hachage ne pas permettre que cela arrive facilement.
De la façon que je peux penser à du haut de ma tête est de sélectionner au hasard un nombre entre 1 et la taille de la table de hachage, et puis commencer à parcourir plus de cela, le maintien d'un décompte comme vous allez - lorsque le compteur est égal à ce nombre aléatoire que vous avez choisi, c'est votre élément aléatoire.