0

キーが文字列で値がリストであるHashMapを作成したいと思います。すべての値は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]

「content」にある値は、同じキーの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)
4

2 に答える 2

5

ing するlistFrom_tokenのではなく、毎回新しいものを割り当てる必要があります。clear()これを置き換えます:

            listFrom_token.clear();

と:

            listFrom_token = new ArrayList<Table_token>();

リストを に入れても、リストのコピーは作成されHashMapません。同じリストを何度もクリアして補充しています。

于 2012-09-12T19:46:51.060 に答える
0

データは、idPath が主キーではないことを示しています。それが、マップのキーになるために必要なものです。idToken を Map のキーにする必要があるかもしれません - それはあなたの例で唯一のものです。

もう 1 つの選択肢は、列名をキーにして、リストに値を与えることです。次に、4 つのキーがあり、それぞれに 4 つの値を含むリストがあります。

于 2012-09-12T19:45:16.940 に答える