我在List<String>
中有HashMap
作为值。关键是String
。当我遍历HashMap
并从特定键列表中删除项目时,它会更新映射到地图中所有键的列表。
代码在
之下public class ListClass {
public static void main(String[] args) {
ListClass lc = new ListClass();
for(Map.Entry<String, List<String>> entry : lc.postProcessList().entrySet()) {
System.out.println("Date : "+entry.getKey());
List<String> data = entry.getValue();
for (int i = 0; i < data.size(); i++) {
System.out.println(" Value : "+data.get(i));
}
}
}
private Map<String,List<String>> postProcessList() {
Map<String,List<String>> map = new HashMap<String, List<String>>();
populateMap(map);
for(Map.Entry<String, List<String>> entry : map.entrySet()) {
String dateKey = entry.getKey();
System.out.println("Date key : "+dateKey);
List<String> data = entry.getValue();
System.out.println("List before modification : "+data);
for (int i = 0; i < data.size(); i++) {
String dateNoTime = data.get(i).split(" ")[0];
if(!dateNoTime.equalsIgnoreCase(dateKey)) {
System.out.println("Removing : "+data.get(i));
data.remove(i);
}
}
System.out.println("List after modification: "+data+"\n\n");
}
return map;
}
private Map<String,List<String>> populateMap(Map<String,List<String>> map) {
List<String> list = new ArrayList<String>();
list.add("2015-01-13 09:30:00");
list.add("2015-01-12 05:45:10");
list.add("2015-01-13 06:22:12");
list.add("2015-01-12 01:52:40");
list.add("2015-01-12 02:23:45");
map.put("2015-01-12", list);
map.put("2015-01-13", list);
return map;
}
}
在上面的代码中,Map有一个字符串并保存日期值。列表,即地图的值,包含日期和时间。
第一个键是“2015-01-12”,我正在尝试删除列表中不是“2015-01-12”的项目。现在两个键中的列表都得到了更新。为什么会这样?
答案 0 :(得分:1)
您正在针对两个键向地图添加相同的列表实例。因此,当您使用键“2015-01-12”检索并编辑它时,您将在整个地图中看到更改。
在将列表添加到每个密钥之前,您需要使用list.clone()
或new ArrayList<String>(list)
之类的内容克隆列表。
e.g。
ArrayList<String> list = new ArrayList<String>();
list.add("2015-01-13 09:30:00");
list.add("2015-01-12 05:45:10");
list.add("2015-01-13 06:22:12");
list.add("2015-01-12 01:52:40");
list.add("2015-01-12 02:23:45");
map.put("2015-01-12", (List<String>)list.clone());
map.put("2015-01-13", (List<String>)list.clone());