从hashmap内的列表中删除项目

时间:2015-01-15 17:06:31

标签: java

我在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”的项目。现在两个键中的列表都得到了更新。为什么会这样?

1 个答案:

答案 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());