2016-02-12 29 views
5

Używam MultiKeyMap z kolekcji commons, które zapewniają pary o wielu wartościach. Mam 3 klucze, które są łańcuchami. Mam dwa problemy, których nie rozumiem.Jak iterować w MultiKeyMap?

Jak mogę wykonać iterację po wszystkich parach o wielu wartościach? Z prostą HashMap wiem o tym.

Po drugie, w jaki sposób mogę ustalić pary wszystkich wartości z wieloma pierwszymi kluczami? Oznacza to, że chciałbym uzyskać coś takiego: multiKey.get("key1","key2",?); Tam, gdzie trzeci klucz nie jest określony.

+1

Co jest nie tak z 'mapIterator()'? – Marvin

+0

, więc masz hashmap z hasmsami? Ciekaw jestem, czy robisz ten wieloblokowy projekt, że nie zrobiłeś czegoś takiego jak: multiKey.get ("key1: key2"); więc w ten sposób ciąg 'klucz' jest tak naprawdę kluczem 1 i kluczem 2 połączonymi ze sobą. – Fallenreaper

+0

@Marvin przybił twoje pierwsze pytanie, a odpowiedź na drugie pytanie brzmi, że nie możesz dokonać częściowego dopasowywania, ponieważ nie jest ono obsługiwane przez interfejs API: https://commons.apache.org/proper/commons-collections/apidocs/org/ apache/commons/collections4/map/MultiKeyMap.html # decorated() – alfasin

Odpowiedz

3

Iteracja nad klucz-wartość dla MultiKeyMap jest podobny do mieszania mapę:

MultiKeyMap<String, String> multiKeyMap = new MultiKeyMap(); 

    multiKeyMap.put("a1", "b1", "c1", "value1"); 
    multiKeyMap.put("a2", "b2", "c2", "value1"); 

    for(Map.Entry<MultiKey<? extends String>, String> entry: multiKeyMap.entrySet()){ 
     System.out.println(entry.getKey().getKey(0) 
       +" "+entry.getKey().getKey(1) 
       +" "+entry.getKey().getKey(2) 
       + " value: "+entry.getValue()); 
    } 

Za drugie życzenie można napisać swoją własną metodę na podstawie poprzedniej iteracji.

public static Set<Map.Entry<MultiKey<? extends String>, String>> match2Keys(String first, String second, 
                       MultiKeyMap<String, String> multiKeyMap) { 
     Set<Map.Entry<MultiKey<? extends String>, String>> set = new HashSet<>(); 
     for (Map.Entry<MultiKey<? extends String>, String> entry : multiKeyMap.entrySet()) { 
      if (first.equals(entry.getKey().getKey(0)) 
       && second.equals(entry.getKey().getKey(1))) { 
       set.add(entry); 
      } 
     } 
     return set; 
    } 
+0

Pierwsza część mnie nie kompiluje. –