[英]Issue related to nested hashmap
我正在寫一個代碼,其中有一個嵌套的哈希圖,一切都很好,同時將child添加到父項,所有不同鍵的值都被最后一個鍵的值覆蓋。 請盡快提出一些解決方案。 在此先感謝以下代碼。
Map<String, Object> provData = new HashMap<String, Object>();
Map<Integer, Map<String, Object>> provNetAndNetLoc = new HashMap<Integer, Map<String, Object>>();
try {
for (Integer provNetCycleId : provNetInfo) {
this.provNetLocPs = jdbcShell.getJdbcConnection().prepareStatement(this.provNetLocQuery);
this.provNetLocPs.setString(1, tin);
this.provNetLocPs.setInt(2, provNetCycleId);
this.provNetLocRs = this.provNetLocPs.executeQuery();
while(this.provNetLocRs.next()){
provData.put("netCycleStartDate", provNetLocRs.getDate("netCycleStartDate"));
provData.put("netCycleEndDate", provNetLocRs.getDate("netCycleEndDate"));
provData.put("netLocCycleId", provNetLocRs.getInt("netLocCycleId"));
provData.put("netLocCycStartDate", provNetLocRs.getDate("netLocCycStartDate"));
provData.put("netLocCycleEndDate", provNetLocRs.getDate("netLocCycleEndDate"));
provData.put("locId", provNetLocRs.getInt("locId"));
provData.put("locStartDate", provNetLocRs.getDate("locStartDate"));
provData.put("locEndDate", provNetLocRs.getDate("locEndDate"));
provData.put("provId", provNetLocRs.getInt("provId"));
System.out.println("HashCode "+provData.hashCode());
provNetAndNetLoc.put(provNetCycleId, provData);
}
}
}
我得到的輸出是這樣的:
第一次迭代
{85={locEndDate=4000-01-01, locStartDate=2000-01-01, netCycleStartDate=2014-03-01, provId=87, netLocCycStartDate=2014-03-11, netLocCycleId=67, netLocCycleEndDate=4000-01-01, locId=106, netCycleEndDate=4000-01-01}}
秒迭代
{85={locEndDate=4000-01-01, locStartDate=2014-03-15, netCycleStartDate=2013-03-01, provId=122, netLocCycStartDate=2014-03-01, netLocCycleId=70, netLocCycleEndDate=4000-01-01, locId=208, netCycleEndDate=4000-01-01},
88={locEndDate=4000-01-01, locStartDate=2014-03-15, netCycleStartDate=2013-03-01, provId=122, netLocCycStartDate=2014-03-01, netLocCycleId=70, netLocCycleEndDate=4000-01-01, locId=208, netCycleEndDate=4000-01-01}}
您需要在將provData放入provNextAndNetLoc時復制provData,或在循環的每次迭代中創建一個新的provData。 例如:
for (Integer provNetCycleId : provNetInfo) {
this.provNetLocPs = jdbcShell.getJdbcConnection().prepareStatement(this.provNetLocQuery);
this.provNetLocPs.setString(1, tin);
this.provNetLocPs.setInt(2, provNetCycleId);
this.provNetLocRs = this.provNetLocPs.executeQuery();
while(this.provNetLocRs.next()){
// because I create the map in the inner loop, I'll be loading each
// result into a new map. When it was declared outside the loop, we
// kept referencing the same map instance and thus were overwriting it
Map<String, Object> provData = new HashMap<String, Object>();
provData.put("netCycleStartDate", provNetLocRs.getDate("netCycleStartDate"));
provData.put("netCycleEndDate", provNetLocRs.getDate("netCycleEndDate"));
provData.put("netLocCycleId", provNetLocRs.getInt("netLocCycleId"));
provData.put("netLocCycStartDate", provNetLocRs.getDate("netLocCycStartDate"));
provData.put("netLocCycleEndDate", provNetLocRs.getDate("netLocCycleEndDate"));
provData.put("locId", provNetLocRs.getInt("locId"));
provData.put("locStartDate", provNetLocRs.getDate("locStartDate"));
provData.put("locEndDate", provNetLocRs.getDate("locEndDate"));
provData.put("provId", provNetLocRs.getInt("provId"));
System.out.println("HashCode "+provData.hashCode());
provNetAndNetLoc.put(provNetCycleId, provData);
}
問題是您沒有為每個周期創建一個新的provData-Map。 因此,您在每次迭代過程中始終更改Map的相同實例,並將其放入provNetAndNetLoc中。
我建議您在每個周期中在provData中創建一個新實例。
while(this.provNetLocRs.next()){
provData = new HashMap<String, Object>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.