2014-06-11 69 views
2
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Scanner; 

import mainak.faisal; 
import mainak.pulkit; 

public class StartingPoint { 

    public static void main(String trav[]) { 
     final Map<String, List<String>> paramMap = new HashMap<>(); 
     List<String> list1 = new ArrayList<String>(); 
     list1.add("1"); 
     paramMap.put("segment", list1); 
     list1.clear(); 
     list1.add("2"); 
     paramMap.put("subDepartment", list1); 
     list1.clear(); 
     list1.add("3"); 
     paramMap.put("officerTitle", list1); 

     for(Map.Entry<String, List<String>> entry : paramMap.entrySet()) { 
      String key = entry.getKey(); 
      System.out.println("ACTIONKEY"+"------"+key); 

      for (String value : entry.getValue()) { 
       System.out.println("ACTIONVALUE-----"+value); 
      } 
     } 
    } 
} 

預期輸出:如何製作一個包含列表的java hashmap?

ACTIONKEY------segment 
ACTIONVALUE-----1 
ACTIONKEY------subDepartment 
ACTIONVALUE-----2 
ACTIONKEY------officerTitle 
ACTIONVALUE-----3 

但其顯示:

ACTIONKEY------segment 
ACTIONVALUE-----3 
ACTIONKEY------subDepartment 
ACTIONVALUE-----3 
ACTIONKEY------officerTitle 
ACTIONVALUE-----3 

爲什麼發生這種情況?我如何在不製作不同的列表的情況下達到理想的結果?

+0

所有3個鍵的值都是相同的(即它是'list1') – Ambrish

回答

1

這是因爲您只將List對象的一個​​實例引用到HashMap中。

當對列表的引用更改HashMap的值更改時。

在你的情況

list1.add("1"); 
    paramMap.put("segment", list1); 
    list1.clear(); 
    list1.add("2"); 
    paramMap.put("subDepartment", list1); 
    list1.clear(); 
    list1.add("3"); 

您添加到列表中後,你最後一個值清楚這將是所有的數據值在HashMap

解決方案:

創建每次添加到HashMap時都會有一個List的新實例

2

如果你wan t地圖中有3個不同的列表,那麼你需要創建3個列表。只創建一個列表會導致地圖包含3個引用同一個列表,包含你在最後一步存儲在列表中的內容:

segment --------- 
       \ 
subDepartment---- [3] 
       /
officerTitle ---- 

你想要的是

segment --------- [1] 

subDepartment---- [2] 

officerTitle ---- [3] 

所以你需要3個不同的列表。瞭解在地圖中放置列表不會創建列表的副本。它只將參考(如果您喜歡的話,指針)存儲到作爲參數傳遞的列表中。

+0

謝謝..... Got it!..... –

0

您必須在每次想要放入地圖時創建一個新列表。這是因爲map正在檢查列表的引用,並且您使用相同的引用插入列表,並且map不會存儲重複的鍵,所以基本上它會使用上次給定的列表值更新條目。

1

你需要投入的HashMap之前創建一個列表,

public static void main(String trav[]){ 
     final Map<String, List<String>> paramMap = new HashMap<>(); 
     paramMap.put("segment", Lists.newArrayList("1")); 
     paramMap.put("subDepartment", Lists.newArrayList("2")); 
     paramMap.put("officerTitle", Lists.newArrayList("3")); 
     for(Map.Entry<String, List<String>> entry : paramMap.entrySet()) { 
      String key = entry.getKey(); 
      System.out.println("ACTIONKEY"+"------"+key); 
      for (String value : entry.getValue()) { 
       System.out.println("ACTIONVALUE-----"+value); 
      } 
    } 
+1

爲什麼你要創建並清除list1?番石榴真的需要創建列表嗎? OP不使用番石榴。 –

+0

@JBNizet我編輯了答案 – ravikumar

+0

但是你仍然在使用番石榴。 –

0

可以使每一次新的列表,以及和值值添加到它,然後你把地圖。

這樣的..

地圖<字符串,列表<字符串>>地圖=新的HashMap <字符串,列表<字符串>>();

// create list one and store values 
    List<String> valSetOne = new ArrayList<String>(); 
    valSetOne.add("1"); 
    //valSetOne.add("Aeroplane"); 

    // create list two and store values 
    List<String> valSetTwo = new ArrayList<String>(); 
    valSetTwo.add("2"); 
    // valSetTwo.add("Banana"); 

    // create list three and store values 
    List<String> valSetThree = new ArrayList<String>(); 
    valSetThree.add("3"); 
    //valSetThree.add("Car"); 

    // put values into map 
    map.put("A", valSetOne); 
    map.put("B", valSetTwo); 
    map.put("C", valSetThree); 


    for (Map.Entry<String, List<String>> entry : map.entrySet()) { 
     String key = entry.getKey(); 
     List<String> values = entry.getValue(); 
     System.out.println("Key = " + key); 
     System.out.println("Values = " + values); 
    } 
} 
2

當你傳遞Java對象,你居然傳遞對象的引用和所有你添加指向同一個列表對象JB Nizet在他的回答解釋了項目。以下是你可以做的事情:

  1. 每次將它添加到Hashmap對象時創建一個新列表。
  2. 使用谷歌番石榴集合喜歡:

    Multimap<String, String> multiMap = ArrayListMultimap.create(); 
    
    // put values into map for segment 
    
    multiMap.put("segment", "1"); 
    multiMap.put("segment", "100"); 
    
    // put values into map for subDepartment 
    
    multiMap.put("subDepartment", "2"); 
    multiMap.put("subDepartment", "200"); 
    
    // put values into map for officerTitle 
    
    multiMap.put("officerTitle", "3"); 
    multiMap.put("officerTitle", "300"); 
    
  3. 或使用Apache的百科全書收藏,如:

    // create multimap to store key and values 
    
    MultiMap multiMap = new MultiValueMap(); 
    
    // put values into map for segment 
    
    multiMap.put("segment", "1"); 
    multiMap.put("segment", "100"); 
    
    // put values into map for subDepartment 
    
    multiMap.put("subDepartment", "2"); 
    multiMap.put("subDepartment", "200"); 
    
    // put values into map for officerTitle 
    
    multiMap.put("officerTitle", "3"); 
    multiMap.put("officerTitle", "300"); 
    

所有會給你正確的輸出。 !

+0

感謝您解釋替代方案... –

相關問題