遍历存储在ArrayList中的HashMap中的值

时间:2018-09-10 09:39:45

标签: java arraylist collections hashmap

一个初学者的问题,但是...

我有一个从数据库返回的ResultSet对象-3列30行。

我检索以下数据集:

enter image description here

使用以下内容:

   try {
        preparedStatement = conn.prepareStatement(
                sqlStatement,
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);

        rs = preparedStatement.executeQuery();

        ResultSetMetaData md = rs.getMetaData();
        int columns = md.getColumnCount();

        while(rs.next()) {
            HashMap row = new HashMap(columns);
            for(int i=1; i<=columns; ++i){
                row.put(md.getColumnName(i),rs.getObject(i));
            }
            list.add(row);
        }

...我将其作为ArrayList返回

enter image description here

...,在调试时显示如下:

enter image description here

我希望能够以伪代码遍历HashMap值:

  1. 获取密钥0
  2. 获取值0、1和2
  3. 将它们用作测试数据
  4. 如果运气不好,请尝试键2

我知道这应该不难,我只是在努力寻找迭代HashMaps的ArrayList的最佳方法

2 个答案:

答案 0 :(得分:2)

您正在使用原始类型,并且您的IDE或编译器向您抛出大量有关此的警告。你应该注意他们。因为没有,所以您能够编写代码,将包含映射的列表(每个映射代表一个返回的db结果,将列名称映射到行中的值)分配给类型为List<String>的变量

这种将数据库行转换为映射的模型不是一个好主意。有很多不错的库可以与数据库交互。例如,JDBI易于理解,具有用于访问结果的更周全的API。它甚至可以将结果映射到Java数据类型。

如果必须使用到目前为止粘贴的模型,对于初学者,请在各处添加泛型,以便编译器将其标记为编译时错误。至少要使该List<Map<String, Object>>

让我重申,将事情切换到JDBI是一条非常优越的路,但是为了回答直接提出的问题,添加泛型并修复变量类型后,您可以执行以下操作:

List<Map<String, Object>> data = getResultSet(syndicatorName);
for (int rowIdx = 0; rowIdx < data.size(); i++) {
    Map<String, Object> row = data.get(rowIdx);
    for (Map.Entry<String, Object> cell : row.entrySet()) {
        System.out.printf("Row %d cell %s: %s\n", rowIdx, cell.getKey(), cell.getValue());
    }
}

请注意,此处的单元格值为“对象”。您必须将它们转换为您知道的数据类型。这不是惯用的Java,但是如果没有完全重新设计getResultSet方法,就无法解决该问题。同样,您真正想要的是JDBI或类似的库。

答案 1 :(得分:1)

您需要一个嵌套循环(至少我会那样做...不仅有其他几种方式):

for (HashMap<T,T> i : ArrayList<HashMap<T,T>>) {
    for (T j : i.keySet()){
        i.get(j);
        //further code
    }
}