繁体   English   中英

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

[英]Iterating over values in a HashMap stored within an ArrayList

有点初学者的问题,但是...

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

我检索以下数据集:

在此处输入图片说明

使用以下内容:

   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返回

在此处输入图片说明

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

在此处输入图片说明

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

  1. 取得钥匙0
  2. 获得值0、1和2
  3. 使用这些作为测试数据
  4. 如果没有运气,请尝试键2

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

您正在使用原始类型,并且您的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或类似的库。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM