2010-10-14 12 views
19

Muszę iterować przez google multimap. AleJak iterować przez google multimap

  1. Używam jdk 1.4 i nie można przejść do wyższej wersji. Więc nie mogę używać ogólnych funkcji.
  2. Moja multimapa może mieć wiele wartości dla klucza.
  3. Nie może być sytuacji, gdy wartość multimapy jest multimap w sobie

Odpowiedz

39

Google Collections (obecnie Guava) jest biblioteką Java 1.5 ... nawet ignorując brak generycznych elementów w Javie 1.4, prawdopodobnie używa rzeczy, które zostały dodane w wersji 1.5, przez co jest niezgodna. Powiedział, że istnieją różne sposoby na iterację poprzez Multimap.

Można iterację wszystkich wartości:

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

Albo wszystkich kluczy (klucz, który mapuje do wielu wartości zbliża się wielokrotnie w iteracji):

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

lub klawisz SET:

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

Albo wpisy:

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

lub wartość Collection s:

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

Można również uzyskać odpowiedni Collection dla każdego klucza w keySet() wykorzystaniem get jak opisał bwawok.

Edit: nie myślałem o tym, że Java 1.4 nie miał pętlę foreach albo, więc oczywiście każda pętla powyżej musiałby być napisany przy użyciu Iterator s bezpośrednio.

+0

nie mogę uwierzyć, że jestem tak głupi, że tworzyłem takie rzeczy jak 'HashMap >' przez lata zamiast używać wielu map – ycomp

10

jestem w Javie 6, ale powinno to być całkiem blisko ... Przepraszam, jeśli coś przeoczyłem java 1.4ish

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

    } 

Każda próba dostanie wszystko, co jest zgodne z tym kluczem. Wtedy możesz albo je oderwać, albo zrobić z nimi, co chcesz.

+0

istnieje jeden problem z mojego kodu. Moje HashMultimap może mieć HashMultimap jako wartość. i get() zwraca Set. Nie mogę ponownie przesłać go do HashMultimap w celu rekursji. –

+0

Czy możesz opisać przypadek użycia wielomapy multimaps :) Wydaje się, że mógłbyś przemyśleć to jako bardziej rozsądną strukturę danych, nie? – bwawok

+0

Konwertuję plik XML (mały rozmiar, więc nie ma prob) do multimapy. Ponieważ tag może zawierać znaczniki wewnątrz. Tak więc multimapa może mieć multimapy w środku. –

2

Podczas korzystania z guawy multimap, wartości są przechowywane w kolekcji, a nie listy

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); 
     } 
    } 
Powiązane problemy