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".

16
demandé sur Garis M Suero 2013-03-15 03:59:08

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())
              );
41
répondu Garis M Suero 2017-10-03 20:00:50

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

http://ideone.com/sx3F0K

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());
}
6
répondu millimoose 2013-03-15 00:05:03

Avec Java 8:

hm.forEach((k, v) -> {
    System.out.println("Key = " + k + " - " + v);
});
3
répondu Misi 2015-09-02 20:10:09

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 utiliser hm.entrySet().iterator(), pas hm.keySet().iterator(). Soit vous itérez sur les touches, soit sur les entrées.
0
répondu Steph 2013-03-15 00:10:13
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");

        }
0
répondu Anthony Raimondo 2013-03-15 00:44:15

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).

0
répondu Bohemian 2014-08-11 22:41:49

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

}
0
répondu Nitin Rahoria 2018-03-03 06:14:46