[英]How to make a java hashmap containing list?
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);
}
}
}
}
預期產量:
ACTIONKEY------segment
ACTIONVALUE-----1
ACTIONKEY------subDepartment
ACTIONVALUE-----2
ACTIONKEY------officerTitle
ACTIONVALUE-----3
但其顯示:
ACTIONKEY------segment
ACTIONVALUE-----3
ACTIONKEY------subDepartment
ACTIONVALUE-----3
ACTIONKEY------officerTitle
ACTIONVALUE-----3
為什么會這樣呢? 如何在沒有列出其他清單的情況下達到期望的結果?
如果要在地圖中包含3個不同的列表,則需要創建3個列表。 僅創建一個列表將導致地圖包含對同一列表的3個引用,其中包含您在最后一步中存儲在列表中的內容:
segment ---------
\
subDepartment---- [3]
/
officerTitle ----
你想要的是
segment --------- [1]
subDepartment---- [2]
officerTitle ---- [3]
因此,您需要3個不同的列表。 了解將列表放在地圖中不會創建列表的副本。 它僅存儲對作為參數傳遞的列表的引用(如果需要,則為指針)。
在Java中傳遞對象時,實際上傳遞的是該對象的引用,您添加的所有項目都指向JB Nizet在其答案中解釋的同一列表對象。 以下是您可以做的事情:
使用Google Guava收藏集,例如:
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");
或使用Apache Commons Collection,例如:
// 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");
一切都會為您提供正確的輸出。 !
這是因為您僅將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的新實例
您需要先創建一個列表,然后再放入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);
}
}
每次要放入地圖時,都必須創建一個新列表。 這是因為map正在檢查列表的引用,並且您要插入具有相同引用的列表,並且map不會存儲重復的鍵,因此基本上它會使用最后給定的列表值來更新條目。
您可以每次創建新列表,並為其添加值,然后放入地圖。
像這樣..
Map <String,List <String >> map = new HashMap <String,List <String >>();
// 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 );
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.