2016-08-24 81 views
0

喜,所以我寫了這個:如何將值一個HashMap中添加值的列表單個鍵(JAVA)

HashMap<String, String> map1 = new HashMap<String, String>(); 
Map<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>(); 

我試圖允許在每個鍵多於1個值一個hashmap。所以如果第一個鍵是'1',我想讓'1'與值'2'和'3'配對。

所以它是這樣的:

1 --> 2 
|--> 3 

但是當我做:

map2.put(key, value); 

提示錯誤,說:「不兼容的類型」,並不能轉換爲ArrayList和它說的錯誤位於該行的value部分。

thenk你多少

+1

地圖列表是好的事情,但它不清楚你想要做什麼 – AndreyS

回答

1

如果您使用的是Java 8,你可以很容易地做到這一點:

String key = "someKey"; 
String value1 = "someValue1"; 
String value2 = "someValue2"; 

Map<String, List<String>> map2 = new HashMap<>(); 
map2.computeIfAbsent(key, k -> new ArrayList<>()).add(value1); 
map2.computeIfAbsent(key, k -> new ArrayList<>()).add(value2); 
System.out.println(map2); 

documentation對於Map.computeIfAbsent(...)幾乎沒有這個例子。

+0

謝謝你!但是有沒有辦法用'computeIfAbsent'完成這個工作? – barneesh

+0

'k - >'不清楚。它是什麼?對不起,無法從文檔鏈接中獲取它。 –

+0

@barneesh,如果你不使用Java 8,下面的krzyk的答案是一個很好的解決方案。 – msandiford

0

map2你需要添加ArrayList(你宣佈它作爲Map<String, ArrayList<String>> - 第二個是值類型)而已,這就是爲什麼它可以讓你不兼容的類型

您需要做初始化與ArrayList鍵和對象後添加到它:

if (!map2.containsKey(key)) { 
    map2.put(key, new ArrayList<String>()); 
} 
map2.get(key).add(value); 

或者你可以使用Multimap從番石榴,那麼你可以map2.put,它不會覆蓋你的價值觀在那裏,但添加到列表。

-1

它給出錯誤,說「不兼容的類型」,它不能轉換爲ArrayList,它說錯誤是在行的值部分。

因爲它不會自動轉換爲ArrayList

您應該將這兩個值添加到列表中,然後將該列表放在地圖中。

+0

誰投了票,在這裏發表評論。 – Azodious

0

這完全是因爲java中的標準Map實現只存儲單對(oneKey,oneValue)。在Java標準Map中爲特定鍵存儲多個值的唯一方法是將「collection」存儲爲值,然後您需要通過鍵訪問該集合(從Map),然後使用該集合「value」作爲常規集合,在你的例子中作爲ArrayList。所以你不要直接通過map.put(除了創建空集合)放置某些東西,而是通過鍵取得整個集合並使用這個集合。

你需要像Multimap之,例如:

 public class Multimap<T,S> { 
     Map<T, ArrayList<S>> map2 = new HashMap<T, ArrayList<S>>(); 

     public void add(T key, S value) { 
      ArrayList<T> currentValuesForGivenKey = get(key); 
      if (currentValuesForGivenKey == null) { 
       currentValuesForGivenKey = new ArrayList<T>(); 
       map2.get(key, currentValuesForGivenKey); 
      } 
      currentValuesForGivenKey.add(value); 
     } 

     public ArrayList<S> get(T key) { 
      ArrayList<String> currentValuesForGivenKey = map2.get(key); 
      if (currentValuesForGivenKey == null) { 
       currentValuesForGivenKey = new ArrayList<S>(); 
       map2.get(key, currentValuesForGivenKey); 
      } 
      return currentValuesForGivenKey; 
     } 

     } 

那麼你可以使用它像這樣:

Multimap<String,String> map2 = new Multimap<String,String>(); 

map2.add("1","2"); 
map2.add("1","3"); 
map2.add("1","4"); 

for (String value: map2.get("1")) { 
    System.out.println(value); 
} 

會打印:

2 
3 
4 
0

你有點遠離你想要做的事情。

Map<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>(); 

這將只允許String作爲鍵和ArrayList作爲值。所以你必須嘗試這樣的:

ArrayList<String> value=new ArrayList<String>(); 
value.add("2"); 
value.add("3"); 
map2.put("1", value); 

當檢索你還必須按照ans相反的程序。然後你可以迭代這個ArrayList來獲得這些值(「2」和「3」);然後你可以迭代這個ArrayList來獲得這些值(「2」和「3」)。

0

試試這個。 //使用列表或設置..但設置避免重複

Map<String, Set<String>> map = new HashMap<>(); 
Set<String> list = new HashSet<>(); 

// add value to the map 

Boolean b = map.containsKey(key); 
       if (b) { 
        map.get(key).addAll(list); 
       } else 
        map.put(key, list); 
      } 
0

您無法在Map中的同一個鍵中添加不同的值。地圖覆蓋該鍵中的值。你可以這樣做。

Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); 
ArrayList<String> list=new ArrayList<String>(); 
list.add("2"); 
list.add("3"); 
map.put("1", list); 

首先在數組列表中添加數值然後放入地圖。

相關問題