2011-03-26 3 views
6

Tworzę program, który musi przechowywać pary klucz-wartość. Program musi przyjmować żądania w postaci kluczy i zwracać odpowiednie wartości.Mapa java z duplikatami kluczy

Problem polega na tym, że czasami istnieje wiele wartości dla każdego klucza, a klasa mapy nie pozwala na duplikowanie kluczy.

Wartości są liczbami, więc nie mogę w sensowny sposób łączyć wartości, jak w przypadku ciągów.

Czy istnieje jakiś elegancki sposób rozliczania faktu, że dla każdego klucza może być więcej niż jedna wartość liczbowa? Chcę, aby każda liczba została zwrócona, a nie tylko losowo.

Odpowiedz

19
$ cat YourMap.java 
public class YourMap extends HashMap<String, List<Integer>> { 
    public void put(String key, Integer number) { 
     List<Integer> current = get(key); 
     if (current == null) { 
      current = new ArrayList<Integer>(); 
      super.put(key, current); 
     } 
     current.add(number); 
    } 

    public static void main(String args[]) { 
     YourMap m = new YourMap(); 
     m.put("a", 1); 
     m.put("a", 2); 
     m.put("b", 3); 
     for(Map.Entry e : m.entrySet()) { 
      System.out.println(e.getKey() + " -> " + e.getValue()); 
     } 
    } 
} 

$ java map 
b -> [3] 
a -> [1, 2] 
+0

nie zapomnij umieścić prąd na mapę po jej utworzeniu. – MeBigFatGuy

+0

Mam to dla ciebie :) –

+0

Ah, tak, doh. Czy powinienem wspomnieć, że kod został przetestowany? :) –

11

Struktura, której szukasz, nazywa się "multimap". Możesz użyć zwykłej mapy z ArrayLists jako wartości lub możesz użyć implementacji multimap. Jest fajny w Google Toolkit "guava". Zobacz here.

4

Jeśli się wartość listę wtedy będzie w stanie przechowywać wiele wartości dla klucza

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