[英]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值:
我知道這應該不難,我只是在努力尋找迭代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.