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
为什么会这样?如何在不制作不同列表的情况下实现预期结果?
答案 0 :(得分:2)
如果您想在地图中使用3个不同的列表,则需要创建3个列表。仅创建一个列表将导致地图包含对同一列表的3个引用,包含您在最后一步中存储在列表中的内容:
segment ---------
\
subDepartment---- [3]
/
officerTitle ----
你想要的是
segment --------- [1]
subDepartment---- [2]
officerTitle ---- [3]
所以你需要3个不同的列表。了解将列表放在地图中不会创建列表的副本。它只将一个引用(一个指针,如果你愿意)存储到作为参数传递的列表中。
答案 1 :(得分:2)
当您在java中传递对象时,实际上传递了该对象的引用,并且您添加的所有项目都指向与他的答案中解释的 JB Nizet 相同的列表对象。以下是你可以做的事情:
使用Google Guava Collections:
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");
所有人都会给你正确的输出。 !
答案 2 :(得分:1)
这是因为您只将一个List对象实例引用到HashMap。
当对List的引用更改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实例
答案 3 :(得分: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);
}
}
答案 4 :(得分:0)
每次要放入地图时,都必须创建新列表。这是因为map正在检查列表的引用,并且您正在插入具有相同引用的列表,并且map将不存储重复键,因此基本上它会使用最后给定的列表值更新条目。
答案 5 :(得分:0)
您可以每次创建新列表,并为其添加值,然后将其放入地图中。
像这样......地图&lt;字符串,列表&lt;串GT;&GT; map = new HashMap&lt;字符串,列表&lt;串GT;&GT;();
// 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 );
}
}