如果内部地图被清除,则在循环中映射<string,map =“”>清空

时间:2016-02-19 05:45:03

标签: java collections hashmap

我从DB获取值,并创建一个Map(String,Map(String,String))

Ex:Map1(001,Map2(2015年9月,11日)) 我在内部地图中收集Id_No(例如001,包含Jan,Sep,Oct)的所有月份,并将内部地图保存到外部地图。

我清除()innerMap以获取下一个Id_No。但是,反过来,OuterMap也正在被清空。 请提出一个想法。感谢您的时间和帮助。

数据库数据格式:

ID_NO   DATE        USAGE

001     Sep-2015    11
001     Oct-2015    12 
001     Jan-2016    68  
008     Feb-2015    4       
008     Mar-2015    2       
008     Sep-2015    5       
012     Feb-2015    16  
012     Mar-2015    20  
012     May-2015    21  
012     Jun-2015    25
012     Sep-2015    22  
012     Oct-2015    26  
028     Jan-2016    29
028     Feb-2015    20  
028     Mar-2015    25  

我的Java代码:

    Map<String ,Map> idMap = new HashMap<String, Map>();
    Map<String,String> usageId = new HashMap<String,String>();

   while (resultSet.next()){

        String id = resultSet.getString(1);

        if(("").equals(id1)){
            id1=id;
            id2=id;
        }
        if(!(id2.equals(id))){
            usageId.clear();
            System.out.println("usageId After Clear : "+idMap);
            System.out.println("idMap After Clear : "+idMap);
            usageId.put(resultSet.getString(2),resultSet.getString(3));
            System.out.println("usageId NOT : "+usageId);
            id2=id;
        }else{
            usageId.put(resultSet.getString(2),resultSet.getString(3));
            System.out.println("usageId EQL : "+usageId);
            id2=id;
        }
        idMap.put(id2,usageId);
        System.out.println("idMap : "+idMap);
    }

输出:

usageId NOT: {Sep-2015=11}
usageId EQL: {Sep-2015=11, oct-2015=12}
usageId EQL: {Sep-2015=11, oct-2015=12, Jan-2015=68}
idMap : {001={Sep-2015=11, oct-2015=12, Jan-2015=68}}
usageId After CLEAR : {}
idMap After CLEAR : {001={}}


usageId NOT: {Feb-2015=4}
usageId EQL: {Feb-2015=4, Mar-2015=2}
usageId EQL: {Feb-2015=4, Mar-2015=2, Sep-2015=5}
idMap : {001={Feb-2015=4, Mar-2015=2, Sep-2015=5},008={Feb-2015=4, Mar-2015=2, Sep-2015=5}}
usageId After CLEAR : {}
idMap After CLEAR : {001={},008={}}

1 个答案:

答案 0 :(得分:4)

当您致电idMap.put()时,它不是复制来自usageId的数据;它将引用放到usageId idMap。由于您永远不会更新usageId引用,idMap中的每个条目都指向同一个对象,该对象被重复覆盖并清除。

如果您想为idMap中的每个条目保留单独的数据,只需更改

即可
usageId.clear();

usageId = new HashMap<String,String>();

这样,外部地图中的每个条目都将引用一个单独的地图实例及其自己的数据。