Iterator sur HashMap en Java
j'ai essayé d'itérer sur hashmap en Java, ce qui devrait être une chose assez facile à faire. Toutefois, le code suivant me donne quelques problèmes:
HashMap hm = new HashMap();
hm.put(0, "zero");
hm.put(1, "one");
Iterator iter = (Iterator) hm.keySet().iterator();
while(iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
System.out.println(entry.getKey() + " - " + entry.getValue());
}
D'abord, j'ai dû lancer Iterator sur hm.keySet().iterator(), parce que sinon il a dit "incompatibilité de Type: impossible de convertir de java.util.Itérateur pour Itérateur". Mais ensuite j'obtiens "la méthode hasNext() n'est pas définie pour le type Iterator", et "la méthode hasNext () n'est pas définie pour le type Iterator".
7 réponses
Peut-on voir votre import
bloc? parce qu'il semble que vous avez importé le mal Iterator
classe.
celui que vous devez utiliser est java.util.Iterator
Pour être sûr, essayons:
java.util.Iterator iter = hm.keySet().iterator();
personnellement, je suggère ce qui suit:
déclaration cartographique à l'aide de Generics
et la déclaration à l'aide de l'Interface Map<K,V>
et la création d'instance en utilisant l'implémentation désirée HashMap<K,V>
Map<Integer, String> hm = new HashMap<>();
et pour la boucle:
for (Integer key : hm.keySet()) {
System.out.println("Key = " + key + " - " + hm.get(key));
}
UPDATE 3/5/2015
Trouvé qu'une itération sur l'Entrée sera meilleure performance sage:
for (Map.Entry<Integer, String> entry : hm.entrySet()) {
Integer key = entry.getKey();
String value = entry.getValue();
}
UPDATE 10/3/2017
pour Java8 et streams, votre solution sera
hm.entrySet().stream().forEach(item ->
System.out.println(item.getKey() + ": " + item.getValue())
);
Vous devriez vraiment utiliser des génériques et le renforcement de la boucle for pour ceci:
Map<Integer, String> hm = new HashMap<>();
hm.put(0, "zero");
hm.put(1, "one");
for (Integer key : hm.keySet()) {
System.out.println(key);
System.out.println(hm.get(key));
}
Ou entrySet()
version:
Map<Integer, String> hm = new HashMap<>();
hm.put(0, "zero");
hm.put(1, "one");
for (Map.Entry<Integer, String> e : hm.entrySet()) {
System.out.println(e.getKey());
System.out.println(e.getValue());
}
Avec Java 8:
hm.forEach((k, v) -> {
System.out.println("Key = " + k + " - " + v);
});
Plusieurs problèmes ici:
- vous n'utilisez probablement pas la bonne classe iterator. Comme les autres ont dit, utiliser
import java.util.Iterator
- si vous voulez utiliser
Map.Entry entry = (Map.Entry) iter.next();
ensuite, vous devez utiliserhm.entrySet().iterator()
, pashm.keySet().iterator()
. Soit vous itérez sur les touches, soit sur les entrées.
Map<String, Car> carMap = new HashMap<String, Car>(16, (float) 0.75);
/ / il n'y a pas d'itérateur pour les cartes, mais il y a des méthodes pour le faire.
Set<String> keys = carMap.keySet(); // returns a set containing all the keys
for(String c : keys)
{
System.out.println(c);
}
Collection<Car> values = carMap.values(); // returns a Collection with all the objects
for(Car c : values)
{
System.out.println(c.getDiscription());
}
/*keySet and the values methods serve as “views” into the Map.
The elements in the set and collection are merely references to the entries in the map,
so any changes made to the elements in the set or collection are reflected in the map, and vice versa.*/
//////////////////////////////////////////////////////////
/*The entrySet method returns a Set of Map.Entry objects.
Entry is an inner interface in the Map interface.
Two of the methods specified by Map.Entry are getKey and getValue.
The getKey method returns the key and getValue returns the value.*/
Set<Map.Entry<String, Car>> cars = carMap.entrySet();
for(Map.Entry<String, Car> e : cars)
{
System.out.println("Keys = " + e.getKey());
System.out.println("Values = " + e.getValue().getDiscription() + "\n");
}
la manière la plus propre est de ne pas (directement) utiliser un itérateur du tout:
- tapez votre carte avec les génériques
- utilisez une boucle foreach pour itérer les entrées:
Comme ceci:
Map<Integer, String> hm = new HashMap<Integer, String>();
hm.put(0, "zero");
hm.put(1, "one");
for (Map.Entry<Integer, String> entry : hm.entrySet()) {
// do something with the entry
System.out.println(entry.getKey() + " - " + entry.getValue());
// the getters are typed:
Integer key = entry.getKey();
String value = entry.getValue();
}
C'est beaucoup plus efficace que d'itérer sur des touches, parce que vous évitez n appels à get(key)
.
Iterator keySet
vous donnera les clés. Vous devez utiliser entrySet
si vous voulez itérer les entrées.
HashMap hm = new HashMap();
hm.put(0, "zero");
hm.put(1, "one");
Iterator iter = (Iterator) hm.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
System.out.println(entry.getKey() + " - " + entry.getValue());
}