HashMap中的对象被覆盖 - java

时间:2012-09-12 19:41:17

标签: java mysql hashmap overwrite

我想创建一个HashMap,其中键是一个字符串,值是List。所有值都来自Mysql表。问题是我有一个HashMap,其中键是正确的,而值不是正确的,因为它被覆盖。事实上,我对所有不同的键具有相同内容的相同列表。 这是代码:

public static HashMap<String,List<Table_token>> getHashMapFromTokenTable() throws SQLException, Exception{

DbAccess.initConnection();
List<Table_token> listFrom_token = new ArrayList();
HashMap<String,List<Table_token>> hMapIdPath = new HashMap<String,List<Table_token>>();

String query = "select * from token";
resultSet = getResultSetByQuery(query);

while(resultSet.next()){

    String token=resultSet.getString(3);
    String path=resultSet.getString(4);
    String word=resultSet.getString(5);
    String lemma=resultSet.getString(6);
    String postag=resultSet.getString(7);
    String isTerminal=resultSet.getString(8);
    Table_token t_token = new Table_token();
    t_token.setIdToken(token);
    t_token.setIdPath(path);
    t_token.setWord(word);
    t_token.setLemma(lemma);
    t_token.setPosTag(postag);
    t_token.setIsTerminal(isTerminal);
    listFrom_token.add(t_token);
    System.out.println("path "+path+" path2: "+token);
    int row = resultSet.getRow();

    if(resultSet.next()){
        if((resultSet.getString(4).compareTo(path)!=0)){    
            hMapIdPath.put(path, listFrom_token);
                listFrom_token.clear();
            }
        resultSet.absolute(row);

    }
    if(resultSet.isLast()){
        hMapIdPath.put(path, listFrom_token);
            listFrom_token.clear();
    }

}

DbAccess.closeConnection();

return hMapIdPath;

}

您可以在下面找到HashMap内容的示例:

键:p000000383 内容:[t0000000000000019231,t0000000000000019232,t0000000000000019233]

键:p000000384 内容:[t0000000000000019231,t0000000000000019232,t0000000000000019233]

“内容”中的值位于Mysql表的最后一行中,用于相同的键。

    mysql> select * from token where idpath='p000003361';
+---------+------------+----------------------+------------+
| idDoc   | idSentence | idToken              | idPath     |
+---------+------------+----------------------+------------+
| d000095 | s000000048 | t0000000000000019231 | p000003361 |
| d000095 | s000000048 | t0000000000000019232 | p000003361 |
| d000095 | s000000048 | t0000000000000019233 | p000003361 |
+---------+------------+----------------------+------------+
3 rows in set (0.04 sec)

2 个答案:

答案 0 :(得分:5)

您需要每次分配一个新listFrom_token而不是clear()。替换这个:

            listFrom_token.clear();

使用:

            listFrom_token = new ArrayList<Table_token>();

将列表放在HashMap会复制列表。您正在一遍又一遍地清理并重新填充相同的列表。

答案 1 :(得分:0)

您的数据显示idPath不是主键。这就是你需要成为地图中的关键所需要的。也许你应该把idToken作为地图中的关键 - 这是你的例子中唯一独一无二的东西。

您的另一个选择是使列名成为键,并将值赋予List。然后你将有四个键,每个键都有一个包含四个值的列表。