簡體   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