简体   繁体   English

与嵌套哈希图有关的问题

[英]Issue related to nested hashmap

I am writing a code in which there is a nested hashmap everything is fine while adding child to parent all the values of the different keys are getting overriden by the last key's value. 我正在写一个代码,其中有一个嵌套的哈希图,一切都很好,同时将child添加到父项,所有不同键的值都被最后一个键的值覆盖。 Please suggest some solution ASAP. 请尽快提出一些解决方案。 Thanks in advance below is the code. 在此先感谢以下代码。

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);     
        }    
    }
}

The output i am getting is like: 我得到的输出是这样的:

In first iteration 第一次迭代

{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}}

Insecond iteration 秒迭代

{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}}

You need to either copy provData when you put it into provNextAndNetLoc or make a new provData on each iteration of the loop. 您需要在将provData放入provNextAndNetLoc时复制provData,或在循环的每次迭代中创建一个新的provData。 For example: 例如:

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);


    }

The problem is that you don't create a new provData-Map for each cycle. 问题是您没有为每个周期创建一个新的provData-Map。 So you change always the same instance of the Map during each iteration and put it in provNetAndNetLoc. 因此,您在每次迭代过程中始终更改Map的相同实例,并将其放入provNetAndNetLoc中。

I would suggest that you create a new instance in provData in each cycle. 我建议您在每个周期中在provData中创建一个新实例。

while(this.provNetLocRs.next()){
    provData = new HashMap<String, Object>();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM