java collections - keyset() vs entrySet() dans la carte
J'ai mis une chaîne d'éléments de tableau est une carte où les éléments de tableau de chaînes est la clé et la fréquence de la parole est la valeur, par exemple:
String[] args = {"if","it","is","to","be","it","is","up","me","to","delegate"};
puis la carte des entrées comme [ if:1, it:2 .... ]
Set<String> keys = m.keySet();
System.out.println("keyset of the map : "+keys);
imprime toutes les touches: "if","it","is","to","be","it","is","up","me","to","delegate"
Set<Map.Entry<String, Integer>> entrySet = m.entrySet();
Iterator<Map.Entry<String, Integer>> i = entrySet.iterator();
while(i.hasNext()){
Map.Entry<String, Integer> element = i.next();
System.out.println("Key: "+element.getKey()+" ,value: "+element.getValue());
}
imprime toutes les principales paires de valeurs :
À l'aide d'entrée de jeu tirages de toutes les valeurs:
Key: if ,value: 1
Key: it ,value: 2
Key: is ,value: 2
Key: to ,value: 2
Key: be ,value: 1
Key: up ,value: 1
Key: me ,value: 1
Key: delegate ,value: 1
Mais le bloc de code ci-dessous doit imprimer exactement le même résultat que ci-dessus, mais il ne le fait pas:
Iterator<String> itr2 = keys.iterator();
while(itr2.hasNext()){
//System.out.println(itr1.next()+" ");
//System.out.println(m.get(itr1.next())+" ");
System.out.println("Key: "+itr2.next()+" ,value: "+m.get(itr2.next()));
}
Il imprime:
Key: if ,value: 2
Key: is ,value: 2
Key: be ,value: 1
Key: me ,value: 1
Mais si nous décommentez la ligne 1 dans la boucle while, j'.e
System.out.println(itr1.next()+" ");
et commentaire de la ligne
System.out.println("Key: "+itr2.next()+" ,value: "+m.get(itr2.next()));
Puis, nous avons toutes les clés: {"if","it","is","to","be","it","is","up","me","to","delegate"};
Si nous utilisons m.get()
avec itr2.next()
, puis l'itérateur n'a pas quelques touches!
- Si vous stockez beaucoup de valeurs de type entier, vous devriez regarder dans le fastutil de la bibliothèque à la place de j.u des collections.
- Le clavier n'aura pas de répétitions, je suppose qu'il ne devrait pas avoir le "il" string imprimé deux fois. Qui vous l'impression après cette appel<String> keys = m.keySet(); System.out.println("le jeu de clés de la carte : "+clés);
Vous devez vous connecter pour publier un commentaire.
Chaque appel à la
Iterator.next()
déplace l'itérateur sur l'élément suivant. Si vous souhaitez utiliser l'élément en cours dans plus d'une instruction ou d'une expression, vous devez le stocker dans une variable locale. Ou encore mieux, pourquoi ne pas simplement utiliser une boucle for-each?En outre, boucle sur le entrySet est plus rapide, car vous n'avez pas de requête de la carte deux fois pour chaque clé. Aussi
Map.Entry
implémentations généralement de mettre en œuvre lestoString()
méthode, de sorte que vous n'avez pas à imprimer la paire clé-valeur manuellement.get()
.Chaque fois que vous appelez itr2.next() vous obtenez une valeur distincte. Pas la même valeur. Vous devez seulement appeler cela une fois dans la boucle.
Traversée sur la grande carte
entrySet()
est beaucoup mieux que lekeySet()
. Vérifier cette tutoriel comment ils permettent d'optimiser le parcours sur le grand objet avec l'aide deentrySet(
) et comment il contribue à l'optimisation des performances.Un
Iterator
se déplace vers l'avant seulement, si elle a le lire une fois, c'est fait. Votreest la lecture de la prochaine valeur de
itr2.next();
, c'est pourquoi il vous manque un peu (en fait pas un peu, toutes les autres touches.De faire des choses simples , veuillez noter que chaque fois que vous faites
itr2.next()
le pointeur se déplace vers l'élément suivant c'est à dire ici, si vous y prêtez attention, le résultat est parfait, selon la logique que vous avez écrit .Ceci peut vous aider à mieux comprendre:
1ère Itération de la boucle While(pointeur est avant le 1er élément):
Clé: si ,valeur: 2
{itr2.next()=if; m.get(itr2.next()=it)=>2}
2ème Itération de la boucle While(pointeur est avant le 3ème élément):
Clé: est ,valeur: 2
{itr2.next()=is; m.get(itr2.next()=to)=>2}
3ème Itération de la boucle While(pointeur est avant le 5ème élément):
Clé: être ,de la valeur: 1
{itr2.next()="be"; m.get(itr2.next()="up")=>"1"}
4ème Itération de la boucle While(pointeur est avant le 7ème élément):
Clé: moi ,valeur: 1
{itr2.next()="me"; m.get(itr2.next()="delegate")=>"1"}
Clé: si ,valeur: 1
Clé: c' ,valeur: 2
Clé: est ,valeur: 2
Touche: pour ,valeur: 2
Clé: être ,de la valeur: 1
La clé: jusqu' ,valeur: 1
Clé: moi ,valeur: 1
Clé: délégué ,valeur: 1
Il imprime:
Clé: si ,valeur: 2
Clé: est ,valeur: 2
Clé: être ,de la valeur: 1
Clé: moi ,valeur: 1