2010-10-14 2 views
19

Devo ripetere su google multimap. MaCome eseguire l'iterazione tramite google multimap

  1. Sto usando jdk 1.4 e non posso passare alla versione superiore. Quindi non posso usare le caratteristiche generiche.
  2. La mia multimappa può avere più valori per una chiave.
  3. Ci potrebbe essere una situazione in cui un valore di multimap è multimap in sé

risposta

39

Google Collections (ora Guava) è una libreria Java 1.5 ... anche ignorando la mancanza di generici in Java 1.4, probabilmente utilizza le cose aggiunte in 1.5, rendendolo incompatibile. Detto questo, ci sono vari modi per iterare attraverso un Multimap.

È possibile scorrere tutti i valori:

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

O tutte le chiavi (una chiave che mappa a più valori fino a venire più volte nella ripetizione):

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

o l'insieme chiave:

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

o le voci:

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

o il valore Collection s:

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

È anche possibile ottenere il corrispondente Collection per ogni chiave nel keySet() utilizzando get come descritto da bwawok.

Edit: non ho pensato al fatto che Java 1.4 non ha avuto il ciclo foreach o, in modo ovviamente ogni ciclo precedente avrebbe dovuto essere scritta utilizzando il Iterator s direttamente.

+0

non posso credere di essere così stupido da creare cose come 'HashMap >' per anni invece di usare una multi-mappa – ycomp

10

Sono in Java 6, ma questo dovrebbe essere abbastanza vicino ... scusate se ho perso qualcosa java 1.4ish

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

    } 

Ogni volta si ottiene di nuovo tutto ciò che corrisponde a quella chiave. Poi puoi staccarli o fare quello che vuoi con loro.

+0

C'è un solo problema con il mio codice. My HashMultimap potrebbe avere HashMultimap come valore. e get() restituisce Set. Non riesco a lanciarlo di nuovo su HashMultimap per la ricorsione. –

+0

Puoi descrivere il caso d'uso di una multimap di multimaps :) Sembra che potresti riconsiderare una struttura dati più sana, no? – bwawok

+0

Sto convertendo un file XML (di piccole dimensioni, quindi senza prob) in un multimap. Poiché un tag può contenere tag all'interno. Quindi un multimap può avere multimap all'interno. –

2

Quando si utilizza guava multimappa, i valori sono memorizzati in Raccolta, non elenca

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