HashMap重复最后一个元素

kai*_*s K 0 java hashmap

我正在尝试创建一个HashMap,HashMap所以我将来更容易访问它的元素,如下所示.

问题是它只重复while循环的最后一个元素而不是其余元素.

HashMap<String,String> result = new HashMap<>();
HashMap<Integer, HashMap<String,String>> fr = new HashMap<>();

int i = 0;
try {
    ResultSet rq = qexec.execSelect();
    // ResultSetFormatter.out(System.out, rq, query);

    // get result from SPARQL query
    while (rq.hasNext()) {
        QuerySolution soln = rq.next();
        id = soln.getLiteral("?id").getLexicalForm();
        //...
        result.put("id",id);
        //...
        if (soln.getLiteral("?wateruse") != null) {
            wateruse = soln.getLiteral("?wateruse").getLexicalForm();
            //...
            result.put("wateruse",wateruse);
        } else {
            System.out.println("NO");
        }               

        fr.put(i, result);
        i++;
    }
} finally {
    qexec.close();
}
Run Code Online (Sandbox Code Playgroud)

这是结果应该是这样的:

John001
High usage
John002
John003
Smith001
Moderate
Smith002
Smith003
...
Kevin001
Low usage
Run Code Online (Sandbox Code Playgroud)

fr只有重复Kevin001,Low usage没有其余的.

我试图把它放在fr.put(i,result)循环之外,但仍然没有给出正确的结果.

编辑

我试图打印fr显示重复元素的所有元素.

finally {

            qexec.close();
        }


        for (int index : fr.keySet()) {
              for(Map.Entry<String, String> entry :result.entrySet()) {
                System.out.println(index + " = " + entry.getKey() + " : " + entry.getValue());
            }
        }
Run Code Online (Sandbox Code Playgroud)

更新 - 解决方案

HashMap如下面的评论中所述,在循环内部声明.

要打印嵌套的HashMap,不需要使用result.我没有如下图所示,它打印都outermapinnermap为好.

        for (int k=0;  k < fr.size(); k++) {
            HashMap<String,String> innermap = fr.get(k);
            for(Map.Entry<String, String> e : innermap.entrySet()) {
                System.out.println(k + " = " + e.getKey() + " : " + e.getValue());
            }
        }
Run Code Online (Sandbox Code Playgroud)

nbr*_*oks 5

result每次循环时,您都会将相同的地图添加到父地图中.result通过循环每次创建一个新实例:

Map<String, String> result = new HashMap<>();
Map<Integer, Map<String, String>> fr = new HashMap<>();

int i = 0;
try {

    ResultSet rq = qexec.execSelect();

    while (rq.hasNext()) {

        // Create your new HashMap inside the loop:
        result = new HashMap<>();

        QuerySolution soln = rq.next();

        id = soln.getLiteral("?id").getLexicalForm();
        //...

        result.put("id",id);
        //...

        if (soln.getLiteral("?wateruse") != null) {

            wateruse = soln.getLiteral("?wateruse").getLexicalForm();
            //...
            result.put("wateruse",wateruse);
        }
        else {
            System.out.println("NO");
        }               

        fr.put(i,result);
        i++;
    }
}
Run Code Online (Sandbox Code Playgroud)

要从fr嵌套地图打印结果,您可以执行以下操作:

for (Map<String, String> map : fr.values()) {
    for(Map.Entry<String, String> e : map.entrySet()) {
        System.out.println(index + " = " + e.getKey() 
            + " : " + e.getValue());
    }
}
Run Code Online (Sandbox Code Playgroud)