我从数据库获取值,并创建一个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>();
这样,外部地图中的每个条目都将引用具有其自身数据的单独地图实例。