我从数据库获取值,并创建一个Map(String,Map(String,String))

例如:Map1(001,Map2(2015年9月11日))
我在内部MAP中收集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={}}

最佳答案

调用idMap.put()时,它不是从usageId复制数据;而是从usageId复制数据。它将对idMap的引用放入usageId。由于您从不更新idMap引用,因此idMap中的每个条目都指向同一对象,该对象被反复覆盖和清除。

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

usageId.clear();




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


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

09-04 10:58