comment obtenir une entrée de hashmap sans itération

Existe-t-il une manière élégante d’obtenir une seule Entry partir de HashMap, sans itération, si la clé n’est pas connue?

Comme l’ordre d’entrée n’est pas important, pouvons-nous dire quelque chose comme

 hashMapObject.get(zeroth_index); 

Bien que je sois conscient qu’il n’existe pas de méthode get by index.

Si j’essayais l’approche mentionnée ci-dessous, il faudrait tout obtenir l’ensemble des entrées du hashmap .

 for(Map.Entry entry : MapObj.entrySet()) { return entry; } 

Les suggestions sont les bienvenues.

EDIT: S’il vous plaît suggérer toute autre structure de données pour satisfaire aux exigences.

La réponse de Jesper est bonne. Une autre solution consiste à utiliser TreeMap (vous avez demandé d’autres structures de données).

 TreeMap myMap = new TreeMap(); Ssortingng first = myMap.firstEntry().getValue(); Ssortingng firstOther = myMap.get(myMap.firstKey()); 

TreeMap a une surcharge afin que HashMap soit plus rapide, mais juste comme exemple de solution alternative.

Les cartes ne sont pas ordonnées, il n’y a donc pas de «première entrée», et c’est pourquoi il n’y a pas de méthode get by index sur Map (ou HashMap ).

Vous pourriez faire ceci:

 Map map = ...; // wherever you get this from // Get the first entry that the iterator returns Map.Entry entry = map.entrySet().iterator().next(); 

(Remarque: vérification d’une carte vide omise).

Votre code n’obtient pas toutes les entrées de la carte, il retourne immédiatement (et sort de la boucle) avec la première entrée trouvée.

Pour imprimer la clé et la valeur de ce premier élément:

 System.out.println("Key: "+entry.getKey()+", Value: "+entry.getValue()); 

Remarque: L’appel de l’ iterator() ne signifie pas que vous parcourez l’intégralité de la carte.

Je suppose que l’iterator peut être la solution la plus simple.

 return hashMapObject.entrySet().iterator().next(); 

Une autre solution (pas jolie):

 return new ArrayList(hashMapObject.entrySet()).get(0); 

Ou encore (pas mieux):

 return hashMapObject.entrySet().toArray()[0]; 

Obtenez des valeurs, convertissez-les en un tableau, récupérez le premier élément du tableau:

 map.values().toArray()[0] 

W.

Pourquoi voulez-vous éviter d’appeler entrySet() il ne crée généralement pas un object entièrement nouveau avec son propre contexte, mais fournit simplement un object de façade. Simplement parler entrySet() est une opération plutôt économique.

Si vous voulez vraiment l’API que vous avez suggérée, vous pouvez sous-classer HashMap et garder une trace des clés dans une liste par exemple. Ne le voyez pas vraiment, mais cela vous donne ce que vous voulez. Si vous expliquez le cas d’utilisation prévu, peut-être pourrions-nous trouver une meilleure solution.

 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @SuppressWarnings("unchecked") public class IndexedMap extends HashMap { private List keyIndex; public IndexedMap() { keyIndex = new ArrayList(); } /** * Returns the key at the specified position in this Map's keyIndex. * * @param index * index of the element to return * @return the element at the specified position in this list * @throws IndexOutOfBoundsException * if the index is out of range (index < 0 || index >= size()) */ public Object get(int index) { return keyIndex.get(index); } @Override public Object put(Object key, Object value) { addKeyToIndex(key); return super.put(key, value); } @Override public void putAll(Map source) { for (Object key : source.keySet()) { addKeyToIndex(key); } super.putAll(source); } private void addKeyToIndex(Object key) { if (!keyIndex.contains(key)) { keyIndex.add(key); } } @Override public Object remove(Object key) { keyIndex.remove(key); return super.remove(key); } } 

EDIT: Je n’ai pas délibérément plongé dans le côté générique de cette …

Si vous utilisez Java 8, c’est aussi simple que findFirst () :

Exemple rapide:

 Optional theCarFoundOpt = carMap.values().stream().findFirst(); if(theCarFoundOpt.isPresent()) { return theCarFoundOpt.get().startEngine(); } 

Que voulez-vous dire par “sans itération”?

Vous pouvez utiliser map.entrySet().iterator().next() et vous ne devez pas parcourir la carte (au sens de “toucher chaque object”). Vous ne pouvez pas obtenir une Entry sans utiliser un iterator. Le Javadoc de Map.Entry dit:

La méthode Map.entrySet renvoie une vue de collection de la carte, dont les éléments sont de cette classe. La seule façon d’obtenir une référence à une entrée de carte provient de l’iterator de cette vue de collection. Ces objects Map.Entry ne sont valides que pour la durée de l’itération.

Pouvez-vous expliquer plus en détail ce que vous essayez d’accomplir? Si vous voulez gérer les objects en premier, ceux qui correspondent à un critère spécifique (comme “avoir une clé particulière”) et utiliser les objects restants sinon, regardez PriorityQueue . Il va ordonner vos objects en fonction de l’ordre naturel ou d’un Comparator que vous fournissez.

 import java.util.*; public class Friday { public static void main(Ssortingng[] args) { Map map = new HashMap(); map.put("code", 10); map.put("to", 11); map.put("joy", 12); if (! map.isEmpty()) { Map.Entry entry = map.entrySet().iterator().next(); System.out.println(entry); } } } 

Cette approche ne fonctionne pas car vous avez utilisé HashMap. Je suppose qu’en utilisant LinkedHashMap sera la bonne solution dans ce cas.

Cela donnerait une seule entrée de la carte, qui à peu près aussi proche que possible, étant donné que «premier» ne s’applique pas vraiment.

 import java.util.*; public class Friday { public static void main(Ssortingng[] args) { Map map = new HashMap(); map.put("code", 10); map.put("to", 11); map.put("joy", 12); if (! map.isEmpty()) { Map.Entry entry = map.entrySet().iterator().next(); System.out.println(entry); } } } 

Trébuché ici à la recherche de la même chose … je me suis alors souvenu de la classe Iterables de la bibliothèque Guava .

Pour obtenir le “premier” élément: Iterables.getFirst( someMap.values(), null ); .
Map.values().iterator().next() essentiellement la même chose que Map.values().iterator().next() , mais vous permet également de spécifier une valeur par défaut (dans ce cas null) si la map ne Map.values().iterator().next() rien.

Iterables.getLast( someMap.values(), null ); renvoie le dernier élément de la carte.

Iterables.get( someMap.values(), 7, null ); renvoie le 7ème élément de la carte si elle existe, sinon une valeur par défaut (dans ce cas nulle).

Rappelez-vous cependant que les HashMaps ne sont pas ordonnés … alors ne vous attendez pas à ce que Iterables.getFirst retourne le premier élément que vous y avez ajouté … de même avec Iterables.getLast . Peut-être utile pour obtenir une valeur mappée si.

Cela ne vaut peut-être pas la peine d’append la bibliothèque Guava pour cela, mais si vous utilisez certains des utilitaires les plus utiles de cette bibliothèque …

À la suite de votre modification, voici ma suggestion:

Si vous n’avez qu’une seule entrée, vous pouvez remplacer la carte par un object double. Selon les types et vos préférences:

  • un tableau (de 2 valeurs, clé et valeur)
  • un object simple avec deux propriétés
 mapm; auto it=m.begin();//get iterator to the first element of map(m) return m->first;//return first ssortingng(1st ssortingng in mapm) //Incase you want the second ssortingng //you can use return m->second(2st ssortingng in mapm) //if you want to iterate the whole map you can use loop for(auto it:m)//m is a map cout< first<  

J’ai la réponse: (c’est simple)

Prenez une ArrayList puis lancez-la et trouvez la taille de l’arraylist. C’est ici :

  ArrayList count = new ArrayList(); count=(ArrayList) maptabcolname.get("k1"); //here "k1" is Key System.out.println("number of elements="+count.size()); 

Il montrera la taille. (Donner une suggestion). Ça marche.