【问题标题】:Iterating over values in a HashMap stored within an ArrayList遍历存储在 ArrayList 中的 HashMap 中的值
【发布时间】:2019-02-14 17:19:25
【问题描述】:

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

我有一个从数据库返回的 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

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

【问题讨论】:

  • 您可以使用 java 8 流与 flatmap 一起访问内部 HashMap
  • 为什么第4步是“try key 2”?钥匙1怎么了?由于第 2 步中项目的顺序似乎很重要,您应该查看 LinkedHashMap

标签: java arraylist collections hashmap


【解决方案1】:

您正在使用原始类型,而您的 IDE 或编译器会向您发出大量警告。你应该注意他们。因为你没有,所以你可以编写代码来分配一个包含映射的列表(每个映射代表一个返回的数据库结果,将列名映射到行中的值)......到类型为List&lt;String&gt;的变量。

这种将数据库行转换为地图的模型是个坏主意。有很多不错的库可以与 DB 交互。例如,JDBI 易于理解,具有更深思熟虑的 API 用于访问结果。它甚至可以将结果映射到 java 数据类型。

如果您必须使用到目前为止已粘贴的模型,对于初学者,请在任何地方添加泛型,以便编译器将其标记为编译时错误。至少要做到List&lt;Map&lt;String, Object&gt;&gt;

让我重申一下,将事情切换到 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 或类似的库是您真正想要的。

【讨论】:

  • 谢谢@rzwitserloot,这非常有用,我将探索 JDBI 并重新设计!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多