代码之家  ›  专栏  ›  技术社区  ›  Steerpike

迭代存储在arraylist中的哈希映射中的值

  •  2
  • Steerpike  · 技术社区  · 7 年前

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

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

    我检索以下数据集:

    使用以下内容:

    try{
    PreparedStatement=康涅狄格州(
    SQL语句
    resultset.type_scroll_不敏感,
    resultset.concur_只读);
    
    rs=PreparedStatement.ExecuteQuery();
    
    结果setmetadata md=rs.getmetadata();
    int columns=md.getcolumncount();
    
    while(rs.next())时{
    hashmap row=新的hashmap(列);
    对于(int i=1;i<=columns;++i){
    row.put(md.getcolumnname(i),rs.getobject(i));
    }
    添加(行);
    }
    < /代码> 
    
    

    …我将其作为数组列表返回

    …调试时显示如下:

    我希望能够在伪代码中迭代hashmap值:

    1. 获取键0
    2. 获取值0、1和2
    3. 使用这些作为测试数据
    4. 如果运气不好,试试2号键。

    这不难,我知道,我只是在努力寻找迭代哈希图数组列表的最佳方法机翼数据集:

    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);
            }
    

    …我把它作为数组列表返回

    enter image description here

    …调试时显示如下:

    enter image description here

    我希望能够以伪代码迭代hashmap值:

    1. 获取密钥0
    2. 获取值0、1和2
    3. 使用这些作为测试数据
    4. 如果运气不好,试试2号键。

    这不难,我知道,我只是在努力寻找迭代哈希图数组列表的最佳方法。

    2 回复  |  直到 7 年前
        1
  •  2
  •   rzwitserloot    7 年前

    您使用的是原始类型,而您的IDE或编译器向您发送了大量有关此问题的警告。你应该注意他们。因为您没有这样做,所以可以编写代码来分配包含映射的列表(每个映射表示一个返回的db结果,将列名映射到行中的值)。到类型的变量 List<String> .

    这种将数据库行转换为映射的模型是个坏主意。有很多不错的图书馆可以与DBS互动。例如, 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());
        }
    }
    

    请注意,您的单元格值是“object”。您必须将它们强制转换为您所知道的数据类型。这不是惯用的Java,但没有办法完全不必重新设计GETRESUTSET方法。再一次。。JDBI或类似的库是您真正想要的。

        2
  •  1
  •   Proph3cy    7 年前

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

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