Question

Si j'ai un objet qui implémente l' Map interface en Java et je souhaite effectuer une itération sur chaque paire qu'il contient, ce qui est le moyen le plus efficace de passer par la carte?

Sera l'ordre des éléments dépendent de l'application de la feuille que j'ai pour l'interface?

Était-ce utile?

La solution

Map<String, String> map = ...
for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + "/" + entry.getValue());
}

Autres conseils

Pour résumer les autres réponses et de les combiner avec ce que je sais, j'ai trouvé 10 façons de le faire (voir ci-dessous).Aussi, j'ai écrit quelques tests de performance (voir les résultats ci-dessous).Par exemple, si nous voulons trouver la somme de toutes les clés et les valeurs d'une carte, on peut écrire:

  1. À l'aide de itérateur et Carte.Entrée

    long i = 0;
    Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry<Integer, Integer> pair = it.next();
        i += pair.getKey() + pair.getValue();
    }
    
  2. À l'aide de foreach et Carte.Entrée

    long i = 0;
    for (Map.Entry<Integer, Integer> pair : map.entrySet()) {
        i += pair.getKey() + pair.getValue();
    }
    
  3. À l'aide de forEach à partir de Java 8

    final long[] i = {0};
    map.forEach((k, v) -> i[0] += k + v);
    
  4. À l'aide de jeu de clés et foreach

    long i = 0;
    for (Integer key : map.keySet()) {
        i += key + map.get(key);
    }
    
  5. À l'aide de jeu de clés et itérateur

    long i = 0;
    Iterator<Integer> itr2 = map.keySet().iterator();
    while (itr2.hasNext()) {
        Integer key = itr2.next();
        i += key + map.get(key);
    }
    
  6. À l'aide de pour et Carte.Entrée

    long i = 0;
    for (Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); entries.hasNext(); ) {
        Map.Entry<Integer, Integer> entry = entries.next();
        i += entry.getKey() + entry.getValue();
    }
    
  7. À l'aide de Java 8 Flux API

    final long[] i = {0};
    map.entrySet().stream().forEach(e -> i[0] += e.getKey() + e.getValue());
    
  8. À l'aide de Java 8 Flux API parallèle

    final long[] i = {0};
    map.entrySet().stream().parallel().forEach(e -> i[0] += e.getKey() + e.getValue());
    
  9. À l'aide de IterableMap de Apache Collections

    long i = 0;
    MapIterator<Integer, Integer> it = iterableMap.mapIterator();
    while (it.hasNext()) {
        i += it.next() + it.getValue();
    }
    
  10. À l'aide de MutableMap de Eclipse (CS) des collections

    final long[] i = {0};
    mutableMap.forEachKeyValue((key, value) -> {
        i[0] += key + value;
    });
    

Les performances des tests (mode = AverageTime, le système = Windows 8.1 64 bits, Intel i7-4790 3.60 GHz, 16 GO)

  1. Pour la petite carte (100 éléments), score 0.308 est le meilleur

    Benchmark                          Mode  Cnt  Score    Error  Units
    test3_UsingForEachAndJava8         avgt  10   0.308 ±  0.021  µs/op
    test10_UsingEclipseMap             avgt  10   0.309 ±  0.009  µs/op
    test1_UsingWhileAndMapEntry        avgt  10   0.380 ±  0.014  µs/op
    test6_UsingForAndIterator          avgt  10   0.387 ±  0.016  µs/op
    test2_UsingForEachAndMapEntry      avgt  10   0.391 ±  0.023  µs/op
    test7_UsingJava8StreamApi          avgt  10   0.510 ±  0.014  µs/op
    test9_UsingApacheIterableMap       avgt  10   0.524 ±  0.008  µs/op
    test4_UsingKeySetAndForEach        avgt  10   0.816 ±  0.026  µs/op
    test5_UsingKeySetAndIterator       avgt  10   0.863 ±  0.025  µs/op
    test8_UsingJava8StreamApiParallel  avgt  10   5.552 ±  0.185  µs/op
    
  2. Pour la carte avec 10000 éléments, score 37.606 est le meilleur

    Benchmark                           Mode   Cnt  Score      Error   Units
    test10_UsingEclipseMap              avgt   10    37.606 ±   0.790  µs/op
    test3_UsingForEachAndJava8          avgt   10    50.368 ±   0.887  µs/op
    test6_UsingForAndIterator           avgt   10    50.332 ±   0.507  µs/op
    test2_UsingForEachAndMapEntry       avgt   10    51.406 ±   1.032  µs/op
    test1_UsingWhileAndMapEntry         avgt   10    52.538 ±   2.431  µs/op
    test7_UsingJava8StreamApi           avgt   10    54.464 ±   0.712  µs/op
    test4_UsingKeySetAndForEach         avgt   10    79.016 ±  25.345  µs/op
    test5_UsingKeySetAndIterator        avgt   10    91.105 ±  10.220  µs/op
    test8_UsingJava8StreamApiParallel   avgt   10   112.511 ±   0.365  µs/op
    test9_UsingApacheIterableMap        avgt   10   125.714 ±   1.935  µs/op
    
  3. Pour la carte avec 100000 éléments, score 1184.767 est le meilleur

    Benchmark                          Mode   Cnt  Score        Error    Units
    test1_UsingWhileAndMapEntry        avgt   10   1184.767 ±   332.968  µs/op
    test10_UsingEclipseMap             avgt   10   1191.735 ±   304.273  µs/op
    test2_UsingForEachAndMapEntry      avgt   10   1205.815 ±   366.043  µs/op
    test6_UsingForAndIterator          avgt   10   1206.873 ±   367.272  µs/op
    test8_UsingJava8StreamApiParallel  avgt   10   1485.895 ±   233.143  µs/op
    test5_UsingKeySetAndIterator       avgt   10   1540.281 ±   357.497  µs/op
    test4_UsingKeySetAndForEach        avgt   10   1593.342 ±   294.417  µs/op
    test3_UsingForEachAndJava8         avgt   10   1666.296 ±   126.443  µs/op
    test7_UsingJava8StreamApi          avgt   10   1706.676 ±   436.867  µs/op
    test9_UsingApacheIterableMap       avgt   10   3289.866 ±  1445.564  µs/op
    

Les graphes (tests de performance en fonction de la taille de la carte)

Enter image description here

Tableau (perfomance des tests en fonction de la taille de la carte)

          100     600      1100     1600     2100
test10    0.333    1.631    2.752    5.937    8.024
test3     0.309    1.971    4.147    8.147   10.473
test6     0.372    2.190    4.470    8.322   10.531
test1     0.405    2.237    4.616    8.645   10.707
test2     0.376    2.267    4.809    8.403   10.910
test7     0.473    2.448    5.668    9.790   12.125
test9     0.565    2.830    5.952   13.220   16.965
test4     0.808    5.012    8.813   13.939   17.407
test5     0.810    5.104    8.533   14.064   17.422
test8     5.173   12.499   17.351   24.671   30.403

Tous les tests sont sur GitHub.

Dans Java 8, vous pouvez le faire nettoyer et rapide à l'aide de la nouvelle lambdas caractéristiques:

 Map<String,String> map = new HashMap<>();
 map.put("SomeKey", "SomeValue");
 map.forEach( (k,v) -> [do something with key and value] );

 // such as
 map.forEach( (k,v) -> System.out.println("Key: " + k + ": Value: " + v));

Le type de k et v sera déduit par le compilateur et il n'est pas nécessaire d'utiliser Map.Entry plus.

Facile comme bonjour!

Oui, l'ordre dépend de la Carte spécifique de mise en œuvre.

@ScArcher2 a le plus élégant de la syntaxe de Java 1.5.Dans la version 1.4, je voudrais faire quelque chose comme ceci:

Iterator entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
  Entry thisEntry = (Entry) entries.next();
  Object key = thisEntry.getKey();
  Object value = thisEntry.getValue();
  // ...
}

Typique code pour une itération sur une carte est:

Map<String,Thing> map = ...;
for (Map.Entry<String,Thing> entry : map.entrySet()) {
    String key = entry.getKey();
    Thing thing = entry.getValue();
    ...
}

HashMap est la forme canonique de la carte de mise en œuvre et ne fait pas de garantie (ou bien qu'il ne devrait pas changer l'ordre si aucune mutation de fonctionnement sont réalisées). SortedMap sera de retour les entrées en fonction de l'ordre naturel des touches, ou un Comparator, si fourni. LinkedHashMap renvoie les entrées d'insertion ou d'accès d'ordre dépendant de la façon dont il a été construit. EnumMap renvoie les entrées dans l'ordre naturel des touches.

(Mise à jour:Je pense que ce n'est plus vrai.) Remarque, IdentityHashMap entrySet itérateur actuellement a un particulier de mise en œuvre qui renvoie les mêmes Map.Entry exemple pour chaque élément de la entrySet!Cependant, chaque fois qu'une nouvelle l'avance l'itérateur Map.Entry est mis à jour.

Exemple d'utilisation d'un itérateur et les génériques:

Iterator<Map.Entry<String, String>> entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
  Map.Entry<String, String> entry = entries.next();
  String key = entry.getKey();
  String value = entry.getValue();
  // ...
}

C'est une deuxième partie de la question:

Comment itérer sur les entrées d'une Carte - @ScArcher2 a répondu parfaitement.

Quel est l'ordre d'itération - si vous êtes juste en utilisant Map, alors, strictement parlant, il y a aucune des garanties de classement.Vous ne pouvez pas vraiment compter sur la commande donnée par toute mise en œuvre.Cependant, l' SortedMap interface étend Map et c'est exactement ce que vous êtes à la recherche pour les implémentations de cadeaux de donner une cohérence ordre de tri.

NavigableMap est une autre extension utile - c'est un SortedMap avec d'autres méthodes pour trouver des entrées par leur ordonna de position dans le jeu de clés.Donc, potentiellement, cela peut éliminer le besoin de l'itération, en premier lieu, vous pourriez être en mesure de trouver la entry vous après l'utilisation de la higherEntry, lowerEntry, ceilingEntry, ou floorEntry des méthodes.L' descendingMap méthode vous donne même une méthode explicite de l'inversion de la traversée de l'ordre.

Il existe plusieurs façons d'effectuer une itération sur la carte.

Voici la comparaison de leurs performances pour un ensemble commun de données stockées dans la carte par le stockage d'un million de paires clé-valeur dans la carte et va se répéter sur la carte.

1) à l'Aide de entrySet() pour chaque boucle

for (Map.Entry<String,Integer> entry : testMap.entrySet()) {
    entry.getKey();
    entry.getValue();
}

50 millisecondes

2) à l'Aide de keySet() pour chaque boucle

for (String key : testMap.keySet()) {
    testMap.get(key);
}

76 millisecondes

3) à l'Aide de entrySet() et itérateur

Iterator<Map.Entry<String,Integer>> itr1 = testMap.entrySet().iterator();
while(itr1.hasNext()) {
    Map.Entry<String,Integer> entry = itr1.next();
    entry.getKey();
    entry.getValue();
}

50 millisecondes

4) à l'Aide de keySet() et itérateur

Iterator itr2 = testMap.keySet().iterator();
while(itr2.hasNext()) {
    String key = itr2.next();
    testMap.get(key);
}

75 millisecondes

J'ai parlé this link.

La bonne façon de le faire est d'utiliser la accepté de répondre que c'est la plus efficace.- Je trouver le code suivant est un peu plus propre.

for (String key: map.keySet()) {
   System.out.println(key + "/" + map.get(key));
}

Pour info, vous pouvez également utiliser map.keySet() et map.values() si vous êtes seulement intéressés par les clés/valeurs de la carte et pas l'autre.

Avec Eclipse Collections (anciennement GS Collections), vous devez utiliser le forEachKeyValue méthode sur l' MapIterable l'interface, qui est héritée par l'MutableMap et ImmutableMap interfaces et leur mise en œuvre.

final MutableBag<String> result = Bags.mutable.empty();
MutableMap<Integer, String> map = Maps.mutable.of(1, "One", 2, "Two", 3, "Three");
map.forEachKeyValue(new Procedure2<Integer, String>()
{
    public void value(Integer key, String value)
    {
        result.add(key + value);
    }
});
Assert.assertEquals(Bags.mutable.of("1One", "2Two", "3Three"), result);

Avec Java 8 lambda syntaxe, vous pouvez écrire le code comme suit:

MutableBag<String> result = Bags.mutable.empty();
MutableMap<Integer, String> map = Maps.mutable.of(1, "One", 2, "Two", 3, "Three");
map.forEachKeyValue((key, value) -> result.add(key + value));
Assert.assertEquals(Bags.mutable.of("1One", "2Two", "3Three"), result);

Note: Je suis un committer pour Eclipse Collections.

En théorie, le moyen le plus efficace dépend de la mise en œuvre du Map.L'officiel de la façon de le faire est d'appeler map.entrySet(), qui retourne un ensemble de Map.Entry, dont chacun contient une clé et une valeur (entry.getKey() et entry.getValue()).

Dans une singulière mise en œuvre, il pourrait faire une différence si vous utilisez map.keySet(), map.entrySet() ou quelque chose d'autre.Mais je ne peux pas penser à une raison pourquoi quelqu'un devrait écrire ça comme ça.Plus vraisemblablement, il ne fait aucune différence de performance ce que vous faites.

Et oui, l'ordre dépendra de la mise en œuvre - ainsi que (peut-être) l'ordre d'insertion et d'autres difficiles à contrôler les facteurs.

[edit] j'ai écrit valueSet() à l'origine, mais bien sûr entrySet() est en fait la réponse.

Java 8:

Vous pouvez utiliser des expressions lambda:

myMap.entrySet().stream().forEach((entry) -> {
    Object currentKey = entry.getKey();
    Object currentValue = entry.getValue();
});

Pour plus d'informations, suivez cette.

Essayez-le avec Java 1.4:

for( Iterator entries = myMap.entrySet().iterator(); entries.hasNext();){

  Entry entry = (Entry) entries.next();

  System.out.println(entry.getKey() + "/" + entry.getValue());

  //...
}

Avec Java 8

map.forEach((k, v) -> System.out.println((k + ":" + v)));

Java 8

Nous avons forEach méthode qui accepte un expression lambda.Nous avons également obtenu flux Les api.Envisager une carte:

Map<String,String> sample = new HashMap<>();
sample.put("A","Apple");
sample.put("B", "Ball");

Itérer sur les touches:

sample.keySet().forEach((k) -> System.out.println(k));

Itération sur les valeurs:

sample.values().forEach((v) -> System.out.println(v));

Itérer sur les entrées (en Utilisant forEach et cours d'eau):

sample.forEach((k,v) -> System.out.println(k + ":" + v)); 
sample.entrySet().stream().forEach((entry) -> {
            Object currentKey = entry.getKey();
            Object currentValue = entry.getValue();
            System.out.println(currentKey + ":" + currentValue);
        });

L'avantage avec les cours d'eau est qu'ils peuvent être parallélisée facilement dans le cas où nous voulons.Nous avons simplement besoin d'utiliser parallelStream() en lieu et place de stream() ci-dessus.

forEachOrdered vs forEach avec des cours d'eau ? L' forEach ne pas suivre la rencontre de commande (si défini) et est intrinsèquement non-déterministe dans la nature où, comme le forEachOrdered n'.Donc forEach ne garantit pas que l'ordre est maintenu.Vérifiez également cette pour plus d'.

Lambda L'Expression De Java 8

En Java 1.8 (Java 8), c'est devenu beaucoup plus facile en utilisant forEach la méthode de l'Agrégat des opérations(Flux des opérations de) qui ressemble à des itérateurs de Itérable De l'Interface.

Il suffit de copier-coller ci-dessous la déclaration de votre code et de renommer la HashMap variable de hm pour votre table de hachage variable d'imprimer des paires clé-valeur.

HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>();
/*
 *     Logic to put the Key,Value pair in your HashMap hm
 */

// Print the key value pair in one line.

hm.forEach((k, v) -> System.out.println("key: " + k + " value:" + v));

// Just copy and paste above line to your code.

Ci-dessous l'exemple de code que j'ai essayé d'utiliser Expression Lambda.Ce truc est tellement cool.Faut essayer.

HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
    Random rand = new Random(47);
    int i = 0;
    while(i < 5) {
        i++;
        int key = rand.nextInt(20);
        int value = rand.nextInt(50);
        System.out.println("Inserting key: " + key + " Value: " + value);
        Integer imap = hm.put(key, value);
        if( imap == null) {
            System.out.println("Inserted");
        } else {
            System.out.println("Replaced with " + imap);
        }               
    }

    hm.forEach((k, v) -> System.out.println("key: " + k + " value:" + v));

Output:

Inserting key: 18 Value: 5
Inserted
Inserting key: 13 Value: 11
Inserted
Inserting key: 1 Value: 29
Inserted
Inserting key: 8 Value: 0
Inserted
Inserting key: 2 Value: 7
Inserted
key: 1 value:29
key: 18 value:5
key: 2 value:7
key: 8 value:0
key: 13 value:11

Aussi, on peut utiliser Spliterator pour les mêmes.

Spliterator sit = hm.entrySet().spliterator();

Mise à JOUR


Y compris des liens vers la documentation d'Oracle Docs.Pour plus d'informations sur Lambda aller à ce lien et doit lire Les Opérations D'Agrégation et pour Spliterator aller à ce lien.

Dans la Carte, on peut Itération sur keys et/ou values et/ou both (e.g., entrySet) dépend des intéressés in_ Comme:

1.) Itérer sur les keys -> keySet() de la carte:

Map<String, Object> map = ...;

for (String key : map.keySet()) {
    //your Business logic...
}

2.) Itérer sur les values -> values() de la carte:

for (Object value : map.values()) {
    //your Business logic...
}

3.) Itérer sur les both -> entrySet() de la carte:

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    //your Business logic...
}

En outre, il y a 3 différence façons de parcourir une table de hachage.Ils sont comme ci-dessous_

//1.
for (Map.Entry entry : hm.entrySet()) {
    System.out.print("key,val: ");
    System.out.println(entry.getKey() + "," + entry.getValue());
}

//2.
Iterator iter = hm.keySet().iterator();
while(iter.hasNext()) {
    Integer key = (Integer)iter.next();
    String val = (String)hm.get(key);
    System.out.println("key,val: " + key + "," + val);
}

//3.
Iterator it = hm.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry entry = (Map.Entry) it.next();
    Integer key = (Integer)entry.getKey();
    String val = (String)entry.getValue();
    System.out.println("key,val: " + key + "," + val);
}

Plus compact avec Java 8:

map.entrySet().forEach(System.out::println);
public class abcd{
    public static void main(String[] args)
    {
       Map<Integer, String> testMap = new HashMap<Integer, String>();
        testMap.put(10, "a");
        testMap.put(20, "b");
        testMap.put(30, "c");
        testMap.put(40, "d");
        for (Integer key:testMap.keySet()) {
            String value=testMap.get(key);
            System.out.println(value);
        }
    }
}

OU

public class abcd {
    public static void main(String[] args)
    {
       Map<Integer, String> testMap = new HashMap<Integer, String>();
        testMap.put(10, "a");
        testMap.put(20, "b");
        testMap.put(30, "c");
        testMap.put(40, "d");
        for (Entry<Integer, String> entry : testMap.entrySet()) {
            Integer key=entry.getKey();
            String value=entry.getValue();
        }
    }
}

Si vous avez un générique de type Carte, vous pouvez utiliser:

Map map = new HashMap();
for (Map.Entry entry : ((Set<Map.Entry>) map.entrySet())) {
    System.out.println(entry.getKey() + "/" + entry.getValue());
}
    Iterator iterator = map.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry element = (Map.Entry)it.next();
        LOGGER.debug("Key: " + element.getKey());
        LOGGER.debug("value: " + element.getValue());    
    }

Vous pouvez le faire en utilisant les génériques:

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry<Integer, Integer> entry = entries.next();
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

L'Utilisation De Java 8:

map.entrySet().forEach(entry -> System.out.println(entry.getValue()));
           //Functional Oprations
            Map<String, String> mapString = new HashMap<>();
            mapString.entrySet().stream().map((entry) -> {
                String mapKey = entry.getKey();
                return entry;
            }).forEach((entry) -> {
                String mapValue = entry.getValue();
            });

            //Intrator
            Map<String, String> mapString = new HashMap<>();
            for (Iterator<Map.Entry<String, String>> it = mapString.entrySet().iterator(); it.hasNext();) {
                Map.Entry<String, String> entry = it.next();
                String mapKey = entry.getKey();
                String mapValue = entry.getValue();
            }

            //Simple for loop
            Map<String, String> mapString = new HashMap<>();
            for (Map.Entry<String, String> entry : mapString.entrySet()) {
                String mapKey = entry.getKey();
                String mapValue = entry.getValue();

            }

La commande dépendra toujours de la carte spécifique de mise en œuvre.À l'aide de Java 8, vous pouvez utiliser l'un de ces:

map.forEach((k,v) -> { System.out.println(k + ":" + v); });

Ou:

map.entrySet().forEach((e) -> {
            System.out.println(e.getKey() + " : " + e.getValue());
        });

Le résultat sera le même (même ordre).Le entrySet soutenu par la carte de sorte que vous obtenez le même ordre.Le second est très pratique car il vous permet d'utiliser des expressions lambda, par exemplesi vous voulez imprimer seulement Entier des objets qui sont supérieures à 5:

map.entrySet()
    .stream()
    .filter(e-> e.getValue() > 5)
    .forEach(System.out::println);

Le code ci-dessous montre l'itération à travers LinkedHashMap et normal HashMap (exemple).Vous verrez la différence dans l'ordre:

public class HMIteration {


    public static void main(String[] args) {
        Map<Object, Object> linkedHashMap = new LinkedHashMap<>();
        Map<Object, Object> hashMap = new HashMap<>();

        for (int i=10; i>=0; i--) {
            linkedHashMap.put(i, i);
            hashMap.put(i, i);
        }

        System.out.println("LinkedHashMap (1): ");
        linkedHashMap.forEach((k,v) -> { System.out.print(k + " (#="+k.hashCode() + "):" + v + ", "); });

        System.out.println("\nLinkedHashMap (2): ");

        linkedHashMap.entrySet().forEach((e) -> {
            System.out.print(e.getKey() + " : " + e.getValue() + ", ");
        });


        System.out.println("\n\nHashMap (1): ");
        hashMap.forEach((k,v) -> { System.out.print(k + " (#:"+k.hashCode() + "):" + v + ", "); });

        System.out.println("\nHashMap (2): ");

        hashMap.entrySet().forEach((e) -> {
            System.out.print(e.getKey() + " : " + e.getValue() + ", ");
        });
    }
}

LinkedHashMap (1):

10 (#=10):10, 9 (#=9):9, 8 (#=8):8, 7 (#=7):7, 6 (#=6):6, 5 (#=5):5, 4 (#=4):4, 3 (#=3):3, 2 (#=2):2, 1 (#=1):1, 0 (#=0):0,

LinkedHashMap (2):

10 : 10, 9 : 9, 8 : 8, 7 : 7, 6 : 6, 5 : 5, 4 : 4, 3 : 3, 2 : 2, 1 : 1, 0 : 0,

HashMap (1):

0 (#:0):0, 1 (#:1):1, 2 (#:2):2, 3 (#:3):3, 4 (#:4):4, 5 (#:5):5, 6 (#:6):6, 7 (#:7):7, 8 (#:8):8, 9 (#:9):9, 10 (#:10):10,

HashMap (2):

0 : 0, 1 : 1, 2 : 2, 3 : 3, 4 : 4, 5 : 5, 6 : 6, 7 : 7, 8 : 8, 9 : 9, 10 : 10,

Un moyen efficace solution itérative sur une Carte est une "pour chaque" boucle à partir de Java 5 par le biais de Java 7.Ici, il est:

for (String key : phnMap.keySet()) {
    System.out.println("Key: " + key + " Value: " + phnMap.get(key));
}

À partir de Java 8, vous pouvez utiliser une expression lambda pour effectuer une itération sur une Carte.C'est une amélioration de 'forEach'

phnMap.forEach((k,v) -> System.out.println("Key: " + k + " Value: " + v));

Si vous voulez écrire un conditionnel pour lambda vous pouvez l'écrire comme ceci:

phnMap.forEach((k,v)->{
    System.out.println("Key: " + k + " Value: " + v);
    if("abc".equals(k)){
        System.out.println("Hello abc");
    }
});

Oui, comme beaucoup de gens convenu que c'est la meilleure façon d'effectuer une itération sur un Map.

Mais il y a des chances pour lancer nullpointerexception si la carte est null.N'oubliez pas de mettre null .de l'enregistrement.

                                                 |
                                                 |
                                         - - - -
                                       |
                                       |
for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
}
package com.test;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Test {

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("ram", "ayodhya");
        map.put("krishan", "mathura");
        map.put("shiv", "kailash");

        System.out.println("********* Keys *********");
        Set<String> keys = map.keySet();
        for (String key : keys) {
            System.out.println(key);
        }

        System.out.println("********* Values *********");
        Collection<String> values = map.values();
        for (String value : values) {
            System.out.println(value);
        }

        System.out.println("***** Keys and Values (Using for each loop) *****");
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + "\t Value: "
                    + entry.getValue());
        }

        System.out.println("***** Keys and Values (Using while loop) *****");
        Iterator<Entry<String, String>> entries = map.entrySet().iterator();
        while (entries.hasNext()) {
            Map.Entry<String, String> entry = (Map.Entry<String, String>) entries
                    .next();
            System.out.println("Key: " + entry.getKey() + "\t Value: "
                    + entry.getValue());
        }

        System.out
                .println("** Keys and Values (Using java 8 using lambdas )***");
        map.forEach((k, v) -> System.out
                .println("Key: " + k + "\t value: " + v));
    }
}

Il y a beaucoup de façons de le faire.Ci-dessous quelques étapes simples:

Supposons que vous avez une Carte comme:

Map<String, Integer> m = new HashMap<String, Integer>();

Ensuite, vous pouvez faire quelque chose comme ci-dessous pour effectuer une itération sur les éléments de la carte.

// ********** Using an iterator ****************
Iterator<Entry<String, Integer>> me = m.entrySet().iterator();
while(me.hasNext()){
    Entry<String, Integer> pair = me.next();
    System.out.println(pair.getKey() + ":" + pair.getValue());
}

// *********** Using foreach ************************
for(Entry<String, Integer> me : m.entrySet()){
    System.out.println(me.getKey() + " : " + me.getValue());
}

// *********** Using keySet *****************************
for(String s : m.keySet()){
    System.out.println(s + " : " + m.get(s));
}

// *********** Using keySet and iterator *****************
Iterator<String> me = m.keySet().iterator();
while(me.hasNext()){
    String key = me.next();
    System.out.println(key + " : " + m.get(key));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top