Existe-t-il un moyen élégant d'en obtenir un seul à Entry<K,V>
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 sache qu'il n'existe pas de méthode get by index.
Si j'essayais l'approche mentionnée ci-dessous, il faudrait toujours obtenir tout le jeu d'entrée de la hashmap .
for(Map.Entry<String, String> entry : MapObj.entrySet()) {
return entry;
}
Les suggestions sont les bienvenues.
EDIT: Veuillez suggérer toute autre structure de données pour répondre aux exigences.
java
collections
nilesh
la source
la source
firstEntry()
méthode n'est pas définie dans l'interfaceSortedMap
mais uniquement dansTreeMap
etConcurrentSkipListMap
:(SortedMap
parce qu'il avait lafirstKey()
méthode.Les cartes ne sont pas ordonnées, il n'y a donc pas de «première entrée», et c'est aussi pourquoi il n'y a pas de méthode get-by-index sur
Map
(ouHashMap
).Vous pouvez faire ceci:
(Remarque: la recherche d'une carte vide est 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:
Remarque: L'appel
iterator()
ne signifie pas que vous effectuez une itération sur toute la carte.la source
LinkedHashMap
conserve les clés dans l'ordre dans lequel elles ont été insérées.Map
implémentations telles queLinkedHashMap
etTreeMap
ont un ordre défini. (HashMap
ne fait pas).Je suppose que l'itérateur est peut-être la solution la plus simple.
Une autre solution (pas jolie):
Ou encore (pas mieux):
la source
Obtenez des valeurs, convertissez-les en tableau, obtenez le premier élément du tableau:
W.
la source
Pourquoi voulez-vous éviter de l'appeler
entrySet()
ne crée généralement pas un objet entièrement nouveau avec son propre contexte, mais fournit simplement un objet de façade. En termes simples,entrySet()
c'est une opération assez bon marché.la source
Si vous utilisez Java 8, c'est aussi simple que findFirst () :
Exemple rapide:
la source
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 voyez pas vraiment l'intérêt de cela, mais cela vous donne ce que vous voulez. Si vous expliquez le cas d'utilisation prévu, nous pourrons peut-être trouver une meilleure solution.
EDIT: Je n'ai délibérément pas plongé dans le côté générique de cela ...
la source
Que voulez-vous dire par "sans itération"?
Vous pouvez utiliser
map.entrySet().iterator().next()
et ne pas parcourir la carte (dans le sens de "toucher chaque objet").Entry<K, V>
Cependant, vous ne pouvez pas mettre la main sur un sans utiliser un itérateur. Le Javadoc de Map.Entry dit:Pouvez-vous expliquer plus en détail ce que vous essayez d'accomplir? Si vous voulez d'abord gérer les objets, qui correspondent à un critère spécifique (comme "avoir une clé particulière") et revenir aux objets restants dans le cas contraire, regardez une PriorityQueue . Il ordonnera vos objets en fonction de l'ordre naturel ou d'une définition personnalisée
Comparator
que vous fournissez.la source
Cette approche ne fonctionne pas car vous avez utilisé HashMap. Je suppose que l'utilisation de LinkedHashMap sera la bonne solution dans ce cas.
la source
Cela obtiendrait une seule entrée de la carte, ce qui est à peu près aussi proche que possible, étant donné que «premier» ne s'applique pas vraiment.
la source
Je suis tombé ici à la recherche de la même chose ... Je me suis alors souvenu de la
Iterables
classe de la bibliothèque Guava .Pour obtenir l'élément « premier »:
Iterables.getFirst( someMap.values(), null );
.Fait 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) s'il n'y a rien dans la carte.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 s'il existe, sinon une valeur par défaut (dans ce cas nul).Rappelez-vous cependant que les HashMaps ne sont pas commandés ... alors ne vous attendez pas
Iterables.getFirst
à renvoyer le premier élément que vous avez jeté là-dedans ... de même avecIterables.getLast
. Peut-être utile pour obtenir un valeur mappée.Cela ne vaut peut-être pas la peine d'ajouter la bibliothèque Guava pour cela, mais si vous utilisez certains des autres utilitaires intéressants de cette bibliothèque ...
la source
Suite à votre EDIT, voici ma suggestion:
Si vous n'avez qu'une seule entrée, vous pouvez remplacer la carte par un objet double. Selon les types et vos préférences:
la source
la source
J'ai la réponse: (c'est simple)
Prenez une ArrayList puis lancez-la et trouvez la taille de l'arraylist. C'est ici :
Il montrera la taille. (Donnez une suggestion). Ça marche.
la source