web-dev-qa-db-fra.com

Itérateur sur HashMap en Java

J'ai essayé d'itérer sur hashmap en Java, ce qui devrait être une chose assez facile à faire. Cependant, le code suivant me pose 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());

}

Premièrement, je devais convertir Iterator sur hm.keySet (). Iterator (), car sinon, il était écrit "Incompatibilité de type: impossible de convertir Java.util.Iterator en Iterator". Mais alors j'obtiens "La méthode hasNext () est indéfinie pour le type Iterator" et "La méthode hasNext () est indéfinie pour le type Iterator".

16
cerebrou

Pouvons-nous voir votre bloc import? car il semble que vous ayez importé la mauvaise classe Iterator.

Celui que vous devriez utiliser est Java.util.Iterator

Pour vous en assurer, essayez:

Java.util.Iterator iter = hm.keySet().iterator();

Je suggère personnellement ce qui suit:

Déclaration de la carte à l'aide de Generics et déclaration à l'aide de l'interface Map<K,V> et création d'une instance à l'aide de 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));
}

MISE &AGRAVE; JOUR 05/03/2015

Nous avons découvert que parcourir le jeu Entry serait plus performant:

for (Map.Entry<Integer, String> entry : hm.entrySet()) {
    Integer key = entry.getKey();
    String value = entry.getValue();

}

MISE &AGRAVE; JOUR 10/3/2017

Pour Java8 et les flux, votre solution sera

 hm.entrySet().stream().forEach(item -> 
                  System.out.println(item.getKey() + ": " + item.getValue())
              );
42
Garis M Suero

Vous devriez vraiment utiliser les génériques et la boucle for améliorée pour cela:

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));
}

http://ideone.com/sx3F0K

Ou la version entrySet():

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());
}
6
millimoose

Avec Java 8:

hm.forEach((k, v) -> {
    System.out.println("Key = " + k + " - " + v);
});
3
Misi

Le moyen le plus propre est de ne pas utiliser (directement) un itérateur:

  • tapez votre carte avec des génériques
  • utilisez une boucle foreach pour parcourir les entrées:

Comme ça:

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 bien plus efficace que d’itérer sur des touches, car vous évitez n appel de get(key).

0
Bohemian

Plusieurs problèmes ici:

  • Vous n'utilisez probablement pas la classe d'itérateurs appropriée. Comme d'autres l'ont dit, utilisez import Java.util.Iterator
  • Si vous voulez utiliser Map.Entry entry = (Map.Entry) iter.next();, vous devez utiliser hm.entrySet().iterator() et non hm.keySet().iterator(). Vous pouvez soit parcourir les clés, soit les entrées.
0
Steph
Map<String, Car> carMap = new HashMap<String, Car>(16, (float) 0.75);

// il n'y a pas d'itérateur pour Maps, mais il existe 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");

        }
0
Anthony Raimondo

Un itérateur à travers keySet vous donnera les clés. Vous devez utiliser entrySet si vous souhaitez itérer des 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());

}
0
Nitin Rahoria