HashMap重复最后一个元素

时间:2017-08-23 03:29:28

标签: 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();
}

结果如下:

John001
High usage
John002
John003
Smith001
Moderate
Smith002
Smith003
...
Kevin001
Low usage

fr仅重复Kevin001Low 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());
            }
        }

更新 - 解决方案

在循环中声明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());
            }
        }

2 个答案:

答案 0 :(得分: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++;
    }
}

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

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

答案 1 :(得分:2)

在这里尝试一个小改动,放置&#34;结果&#34;在while循环中创建地图

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

int i = 0;
try {

    ResultSet rq = qexec.execSelect();

    while (rq.hasNext()) {
        Map<String, String> 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++;
    }
}

这个for循环打印elemenets:

for (int i=0;i< fr.size();i++){
    Map<String,String> element= fr.get(i);
//  use the element here.

}