将哈希映射放入另一个集合的问题

时间:2011-06-18 17:55:38

标签: java hashmap

  1. 在下面的代码中,子循环映射在循环中打印时显示正确的值,但是当在循环外打印父散列映射时,子散列映射显示的映射只包含覆盖所有值的最后一个条目的值。

        public void compareOracleMySQLData() throws SQLException {
        String inputTableName = ConfigurationManager.getProperty("table_name");
    
        int i = 0;
        int j = 0;
        int colCount = 0;
        int oracleRowCount = 0;
        int mysqlRowCount = 0;
        String primaryKeyIni = null;
        String appendStuff = null;
        Connection conO = DBManager.openDbConnection("mysql");
        Connection conM = DBManager.openDbConnection("mysql");
        Statement stmtO = null;
        Statement stmtM = null;
        ResultSet resultSetO = null;
        ResultSet resultSetM = null;
        ArrayList<String> primaryKeyList = new ArrayList<String>();
        Iterator<String> primaryKeyListItr = null;
        HashMap<Object, Object> oraRowDetailsMap = new HashMap<Object, Object>();
        HashMap<String, Object> mysqlRowDetailsMap = new HashMap<String, Object>();
        Map<String, Object> oraRowPrimaryMap = new HashMap<String, Object>();
        HashMap<String, HashMap<String, Object>> mysqlRowPrimaryMap = new HashMap<String, HashMap<String, Object>>();
    //  Map<String, Object> oraRowPrimaryMap=new HashMap<String, Object>();
    //  Map<String, Object> mysqlRowPrimaryMap=new HashMap<String, Object>();
        try {
            if (conO != null && conM != null) {
                if (validateTableStatus(inputTableName, conO, conM)) {
                    // Check table existence in Oracle and Mysql Database
    
                    // Create resultset for oracle
                    stmtO = conO.createStatement(
                            ResultSet.TYPE_SCROLL_INSENSITIVE,
                            ResultSet.CONCUR_READ_ONLY);
                    resultSetO = stmtO.executeQuery(DB_QUERY);
                    ResultSetMetaData rsMetaDataO = resultSetO.getMetaData();
    
                    //
    
                    // MySql details for the same table created
                    stmtM = conM.createStatement(
                            ResultSet.TYPE_SCROLL_INSENSITIVE,
                            ResultSet.CONCUR_READ_ONLY);
                    resultSetM = stmtM.executeQuery(DB_QUERY);
    
                    // Get Column Count for two tables
                    ResultSetMetaData rsMetaDataM = resultSetM.getMetaData();
                    logger.debug("Column Count in Oracle table ::"
                            + rsMetaDataO.getColumnCount());
                    logger.debug("Column Count in Mysql table ::"
                            + rsMetaDataM.getColumnCount());
                    // Match Column count of two tables
                    if (rsMetaDataM.getColumnCount() == rsMetaDataO
                            .getColumnCount()) {
                        logger.debug("The Column count in both table are same");
                        oracleRowCount = getRowCount(inputTableName, resultSetO);
                        mysqlRowCount = getRowCount(inputTableName, resultSetM);
                        logger.debug("No of Rows of Oracle Table :: "
                                + oracleRowCount);
                        logger.debug("No of Rows of Mysql Table :: "
                                + mysqlRowCount);
                        if (oracleRowCount != mysqlRowCount) {
                            logger
                                    .debug("The number of rows of Oracle and Mysql tables respectively differs");
    
                        }
    
    
    
                        else {
                            primaryKeyList = getPrimaryKey(inputTableName, conO);
    
                            while (resultSetO.next()) {
    
                                i = 0;
                                primaryKeyListItr = primaryKeyList.iterator();
                                while (primaryKeyListItr.hasNext()) {
    
                                    if (i == 0) {
                                        primaryKeyIni = (resultSetO
                                                .getObject(primaryKeyListItr
                                                        .next().toString()))
                                                .toString().trim();
    
    
                                    } else {
                                        appendStuff = (resultSetO
                                                .getObject(primaryKeyListItr
                                                        .next().toString()))
                                                .toString().trim();
                                        primaryKeyIni = primaryKeyIni + "$"
                                                + appendStuff;
    
                                    }
                                    i++;
    
                                }
    
                                // 
    
                                colCount = rsMetaDataO.getColumnCount();
                                for (j = 1; j <= colCount; j++) {
                                    System.out.println("Col Name"+rsMetaDataO
                                            .getColumnName(j));
                                    System.out.println("Col Value"+ resultSetO
                                            .getObject(rsMetaDataO
                                                    .getColumnName(j)));
                                    oraRowDetailsMap.put(rsMetaDataO
                                            .getColumnName(j), resultSetO
                                            .getObject(rsMetaDataO
                                                    .getColumnName(j)));
                                }
                                  System.out.println("primaryKeyIni"+primaryKeyIni);
                                System.out.println("oraRowDetailsMap inside loop"+oraRowDetailsMap);
                                oraRowPrimaryMap.put(primaryKeyIni,
                                        oraRowDetailsMap);
      }
       System.out.println("oraRowDetailsMap"+oraRowDetailsMap);System.out.println(oraRowPrimaryMap);
    
                }
    
                    } else {
                        logger.debug("The number of Columns of Oracle and Mysql table differs");
                    }
    
                }
            }
        }
    
        catch (SQLException e) {
            logger.debug("Error in CompareOracleMySQLData()" + e.getMessage());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            DBManager.closeConnection(conO);
            DBManager.closeConnection(conM);
            DBManager.closeStatement(stmtO);
            DBManager.closeStatement(stmtM);
            DBManager.closeResultSet(resultSetO);
            DBManager.closeResultSet(resultSetM);}}
    
  2. 2.输出低于::

                          DEPLOYMENT_LEVEL is: DVL
    DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Connection    to      MYSQL  database established
    DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Connection to      MYSQL  database established
    DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Column Count in Oracle table ::4
    DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Column Count in Mysql table ::4
    DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - The Column count in both table are same
    DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - No of Rows of Oracle Table :: 3
    DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - No of Rows of Mysql Table :: 3
    Col NameFirst_Name
    Col Valuefn
    Col NameLast_Name
    Col Valueln
    Col NameAddress
    Col Valueadr
    Col NameCity
    Col Valuecity
    primaryKeyInifn$ln
    oraRowDetailsMap inside loop{Address=adr, Last_Name=ln, First_Name=fn, City=city}
    Col NameFirst_Name
    Col Valuefn1
    Col NameLast_Name
    Col Valueln1
     Col NameAddress
    Col Valueadr1
    Col NameCity
    Col Valuecity1
    primaryKeyInifn1$ln1
     oraRowDetailsMap inside loop{Address=adr1, Last_Name=ln1, First_Name=fn1, City=city1}
    Col NameFirst_Name
    Col Valuefn3
     Col NameLast_Name
     Col Valueln3
     Col NameAddress
     Col Valueadr3
     Col NameCity
     Col Valuecity3
     primaryKeyInifn3$ln3
      oraRowDetailsMap inside loop{Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}
      oraRowPrimaryMap{fn3$ln3={Address=adr3, Last_Name=ln3, First_Name=fn3,        City=city3},    fn$ln={Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}, fn1$ln1=        {Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}}
    

1 个答案:

答案 0 :(得分:0)

您只是为每一行重复使用相同的oraRowDetailsMap。难怪你在结果中反复使用相同的地图。

在结果集循环中使用Map<...> oraRowDetailsMap = new HashMap<...>();为每一行创建一个新地图,而不是在循环之前只创建一次。