如何在while循环外获取所有HashMap键值对(解决值覆盖问题)
问题原因
你当前的代码中,c1是单个HashMap对象,每次循环都用相同的键"StateName"和"CapitalCity"覆盖之前存入的值——HashMap的键是唯一的,新值会直接替换旧值。所以循环内打印的是每次覆盖后的临时状态,循环结束后自然只剩最后一组数据。
解决方案
以下是几种实现循环外获取所有州及首府数据的方式:
方案一:用List存储多个HashMap
修改方法返回类型为List<HashMap<String,String>>,每次循环创建新的HashMap并添加到列表中,这样就能保留所有组数据:
import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public List<HashMap<String,String>> getStateCapital(String Country) { List<HashMap<String,String>> stateCapitalsList = new ArrayList<>(); // 注意:实际开发中避免直接拼接SQL,防止注入风险,建议用PreparedStatement String query = "你的数据库查询语句" + Country; try (Connection db = DriverManager.getConnection(URL, Username, Password); Statement st = db.createStatement(); ResultSet rs = st.executeQuery(query)) { while(rs.next()) { HashMap<String,String> stateCapital = new HashMap<>(); stateCapital.put("StateName", rs.getString(3)); stateCapital.put("CapitalCity", rs.getString(4)); stateCapitalsList.add(stateCapital); System.out.println(stateCapital); // 打印单组数据 } // 循环外打印所有数据 System.out.println(stateCapitalsList); } catch (SQLException e) { e.printStackTrace(); // 实际项目建议更合理的异常处理逻辑 } return stateCapitalsList; }
方案二:用州名作为键的HashMap(更简洁高效)
如果不需要保留"StateName"和"CapitalCity"的键名,直接用州名映射首府,结构更简洁:
import java.sql.*; import java.util.HashMap; public HashMap<String,String> getStateCapital(String Country) { HashMap<String,String> stateCapitalMap = new HashMap<>(); String query = "你的数据库查询语句" + Country; try (Connection db = DriverManager.getConnection(URL, Username, Password); Statement st = db.createStatement(); ResultSet rs = st.executeQuery(query)) { while(rs.next()) { String stateName = rs.getString(3); String capitalCity = rs.getString(4); stateCapitalMap.put(stateName, capitalCity); System.out.println("StateName=" + stateName + ", CapitalCity=" + capitalCity); } // 循环外打印所有州-首府映射 System.out.println(stateCapitalMap); } catch (SQLException e) { e.printStackTrace(); } return stateCapitalMap; }
方案三:自定义实体类(规范且易扩展)
创建实体类封装州和首府数据,适合后续业务扩展:
import java.sql.*; import java.util.ArrayList; import java.util.List; // 自定义实体类 class StateCapital { private String stateName; private String capitalCity; public StateCapital(String stateName, String capitalCity) { this.stateName = stateName; this.capitalCity = capitalCity; } // 重写toString方法,方便打印输出 @Override public String toString() { return "StateName=" + stateName + ", CapitalCity=" + capitalCity; } // 可选:添加getter、setter方法 } // 修改后的查询方法 public List<StateCapital> getStateCapital(String Country) { List<StateCapital> stateCapitals = new ArrayList<>(); String query = "你的数据库查询语句" + Country; try (Connection db = DriverManager.getConnection(URL, Username, Password); Statement st = db.createStatement(); ResultSet rs = st.executeQuery(query)) { while(rs.next()) { StateCapital sc = new StateCapital(rs.getString(3), rs.getString(4)); stateCapitals.add(sc); System.out.println(sc); } // 循环外打印所有数据 System.out.println(stateCapitals); } catch (SQLException e) { e.printStackTrace(); } return stateCapitals; }
重要提醒
直接拼接SQL字符串存在SQL注入风险,实际开发中建议使用PreparedStatement替代Statement,示例如下:
String query = "SELECT 字段1, 字段2, 字段3, 字段4 FROM 表名 WHERE country = ?"; try (PreparedStatement pst = db.prepareStatement(query)) { pst.setString(1, Country); // 绑定参数 ResultSet rs = pst.executeQuery(); // 后续处理逻辑 }
内容的提问来源于stack exchange,提问作者mohammed azharuddin
相关产品推荐
相关产品推荐

