You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:45:39