Qu'entendez-vous par «position»? Les HashMaps ne sont pas ordonnés, donc ils n'ont pas la notion habituelle de "position" que vous obtiendriez avec quelque chose comme un Vector.
Mat
1
Voulez-vous dire par son ordre d'insertion ou un autre ordre?
Cela ne répond pas vraiment à la question. Les autres réponses ci-dessous sont plus utiles.
forresthopkinsa
6
Avec égards, cela cite une documentation qui répond directement à la question
Wayne
1
Même si l'ordre n'est pas constant dans le temps, il pourrait toujours être possible de récupérer l'un des membres par une position donnée.
Débutant le
Je ne suis pas. Explique?
Wayne
Le lien HashMap est rompu / 404.
Raf
111
Utilisez un LinkedHashMap et lorsque vous avez besoin de récupérer par position, convertissez les valeurs en ArrayList.
LinkedHashMap<String,String> linkedHashMap =newLinkedHashMap<String,String>();/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");/* Get by position */int pos =1;String value =(newArrayList<String>(linkedHashMap.values())).get(pos);
Le plus simple, je dois dire ... Au lieu de tout convertir, vous n'utilisez que des clés. Superbe
kirtan403
19
Si, pour une raison quelconque, vous devez vous en tenir à hashMap, vous pouvez convertir le keySet en tableau et indexer les clés du tableau pour obtenir les valeurs de la carte comme ceci:
Implémentation de table de hachage et de liste liée de l'interface Map, avec ordre d'itération prévisible. Cette implémentation diffère de HashMap en ce qu'elle maintient une liste à double lien parcourant toutes ses entrées.
Je suppose que par «position», vous faites référence à l'ordre dans lequel vous avez inséré les éléments dans le HashMap. Dans ce cas, vous souhaitez utiliser un LinkedHashMap. Le LinkedHashMap n'offre cependant pas de méthode d'accesseur; vous devrez en écrire un comme
Une autre approche de travail consiste à transformer les valeurs de la carte en un tableau, puis à récupérer l'élément à l'index. Un test de 100 000 éléments par recherche d'index dans LinkedHashMap de 100 000 objets utilisant les approches suivantes a conduit aux résultats suivants:
//My answer:publicParticle getElementByIndex(LinkedHashMap<Point,Particle> map,int index){return map.values().toArray(newParticle[map.values().size()])[index];}//68 965 ms//Syd Lambert's answer:publicParticle getElementByIndex(LinkedHashMap<Point,Particle> map,int index){return map.get((map.keySet().toArray())[ index ]);}//80 700 ms
Dans l'ensemble, récupérer un élément par index à partir de LinkedHashMap semble être une opération assez lourde.
HashMap - et la structure de données sous-jacente - les tables de hachage, n'ont pas de notion de position. Contrairement à LinkedList ou Vector, la clé d'entrée est transformée en un «compartiment» où la valeur est stockée. Ces compartiments ne sont pas classés d'une manière qui a du sens en dehors de l'interface HashMap et, en tant que tels, les éléments que vous mettez dans le HashMap ne sont pas dans l'ordre dans le sens que vous attendez avec les autres structures de données
HashMap n'a pas de concept de position, il n'y a donc aucun moyen d'obtenir un objet par position. Les objets dans Maps sont définis et récupérés par clés.
Les HashMaps n'autorisent pas l'accès par position, il ne connaît que le code de hachage et il peut récupérer la valeur s'il peut calculer le code de hachage de la clé. Les TreeMaps ont une notion d'ordre. Les cartes Linkedhas conservent l'ordre dans lequel elles sont entrées sur la carte.
Réponses:
Les HashMaps ne conservent pas l'ordre:
Jetez un œil à LinkedHashMap , qui garantit un ordre d'itération prévisible.
la source
Utilisez un LinkedHashMap et lorsque vous avez besoin de récupérer par position, convertissez les valeurs en ArrayList.
la source
Si vous souhaitez conserver l'ordre dans lequel vous avez ajouté les éléments à la carte, utilisez
LinkedHashMap
plutôt que justeHashMap
.Voici une approche qui vous permettra d'obtenir une valeur par son index dans la carte:
la source
Si, pour une raison quelconque, vous devez vous en tenir à hashMap, vous pouvez convertir le keySet en tableau et indexer les clés du tableau pour obtenir les valeurs de la carte comme ceci:
Vous pouvez ensuite accéder à la carte comme:
la source
String myKey = keys[i].toString();
Utilisez
LinkedHashMap
:la source
Utilisez LinkedHashMap et utilisez cette fonction.
Définissez comme ceci et.
La fonction peut renvoyer l'entrée sélectionnée.
la source
Je suppose que par «position», vous faites référence à l'ordre dans lequel vous avez inséré les éléments dans le HashMap. Dans ce cas, vous souhaitez utiliser un LinkedHashMap. Le LinkedHashMap n'offre cependant pas de méthode d'accesseur; vous devrez en écrire un comme
la source
Une autre approche de travail consiste à transformer les valeurs de la carte en un tableau, puis à récupérer l'élément à l'index. Un test de 100 000 éléments par recherche d'index dans LinkedHashMap de 100 000 objets utilisant les approches suivantes a conduit aux résultats suivants:
Dans l'ensemble, récupérer un élément par index à partir de LinkedHashMap semble être une opération assez lourde.
la source
HashMap - et la structure de données sous-jacente - les tables de hachage, n'ont pas de notion de position. Contrairement à LinkedList ou Vector, la clé d'entrée est transformée en un «compartiment» où la valeur est stockée. Ces compartiments ne sont pas classés d'une manière qui a du sens en dehors de l'interface HashMap et, en tant que tels, les éléments que vous mettez dans le HashMap ne sont pas dans l'ordre dans le sens que vous attendez avec les autres structures de données
la source
HashMap n'a pas de concept de position, il n'y a donc aucun moyen d'obtenir un objet par position. Les objets dans Maps sont définis et récupérés par clés.
la source
vous pouvez utiliser le code ci-dessous pour obtenir la clé:
String [] keys = (String[]) item.keySet().toArray(new String[0]);
et obtenez un objet ou une liste qui s'insèrent dans HashMap avec la clé de cet élément comme ceci:
item.get(keys[position]);
la source
Par défaut, java LinkedHasMap ne prend pas en charge l'obtention de valeur par position. Je suggère donc d'aller avec personnalisé
IndexedLinkedHashMap
Ensuite, vous pouvez utiliser cette LinkedHasMap personnalisée comme
POUR ajouter des valeurs
Pour obtenir la valeur par index
la source
Les HashMaps n'autorisent pas l'accès par position, il ne connaît que le code de hachage et il peut récupérer la valeur s'il peut calculer le code de hachage de la clé. Les TreeMaps ont une notion d'ordre. Les cartes Linkedhas conservent l'ordre dans lequel elles sont entrées sur la carte.
la source
Vous pouvez essayer d'implémenter quelque chose comme ça, regardez:
J'espère que cela fonctionne pour vous.
la source