web-dev-qa-db-fra.com

Comment itérer via google multimap

Je dois parcourir Google Multimap. Mais

  1. J'utilise jdk 1.4 et je ne peux pas passer à une version supérieure. Je ne peux donc pas utiliser de fonctionnalités génériques.
  2. Mon multimap peut avoir plusieurs valeurs pour une clé.
  3. Il pourrait y avoir une situation où une valeur de multimap est multimap en soi
24
Amit Kumar Gupta

Google Collections (maintenant Guava) est une bibliothèque Java 1.5 ... même en ignorant le manque de génériques dans Java 1.4, il utilise probablement des choses qui ont été ajoutées dans 1.5, ce qui le rend incompatible. Cela dit, il existe plusieurs façons de parcourir un Multimap.

Vous pouvez parcourir toutes les valeurs:

for (Object value : multimap.values()) { ... }

Ou toutes les clés (une clé qui correspond à plusieurs valeurs à venir plusieurs fois dans l'itération):

for (Object key : multimap.keys()) { ... }

Ou l'ensemble de clés:

for (Object key : multimap.keySet()) { ... }

Ou les entrées:

for (Map.Entry entry : multimap.entries()) { ... }

Ou la valeur Collections:

for (Collection collection : multimap.asMap().values()) { ... }

Vous pouvez également obtenir le Collection correspondant pour chaque touche de la keySet() en utilisant get comme décrit par bwawok.

Edit: Je n'ai pas pensé au fait que Java 1.4 n'avait pas non plus la boucle foreach, donc bien sûr chaque boucle ci-dessus devrait être écrite en utilisant les Iterators directement.

48
ColinD

Je suis sur Java 6, mais cela devrait être assez proche ... désolé si j'ai raté quelque chose Java 1.4ish

    Set keySet = listmultimap.keySet();
    Iterator keyIterator = keySet.iterator();
    while (keyIterator.hasNext() ) {
        String key = (String) keyIterator.next();
        List values = listmultimap.get( key );

    }

Chaque get vous récupérera tout ce qui correspond à cette clé. Ensuite, vous pouvez soit les décoller, soit faire ce que vous voulez avec eux.

10
bwawok

Lorsque vous utilisez la carte multi-goyave, les valeurs sont stockées dans Collection, pas List

 Set<String> keys = multiMap.keySet();
    for (String keyprint : keys) {
        System.out.println("Key = " + keyprint);
        Collection<String> values = multiMap.get(keyprint);
        for(String value : values){
            System.out.println("Value= "+ value);
        }
    }
3
Jana

Un exemple minimal serait:

public class Test {
    public static void main(String[] args) {
        ListMultimap<String, String> multimap = ArrayListMultimap.create();

        multimap.put("hello", " name");
        multimap.put("hello", " name2");
        multimap.put("world", " ocean");

        for (String firstName : multimap.keySet()) {
            List<String> lastNames = multimap.get(firstName);
            System.out.println(firstName + " " + lastNames);
        }
    }
}

et la sortie:

world [ ocean]
hello [ name,  name2]
0
Kolibril