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

Java如何通过名称获取ArrayList中Hospital对象的对应索引

问题根源

  • ArrayList.indexOf()方法通过equals()方法匹配元素,你直接拿医院名称字符串到存储Hospital实例的hospitals列表中匹配,两种类型完全不匹配,必然返回-1,后续拿-1作为索引访问列表就会触发数组越界。
  • 就算传入的是Hospital实例,如果没有重写Hospital类的equals()方法,默认会比对对象内存地址,只要不是同一个对象实例也会返回-1。

解决方案

方案1:遍历匹配(适合小数据量,新手易上手)

遍历hospitals列表,逐个比对Hospital实例的名称属性和目标医院名字符串,匹配成功返回当前索引:

// 替换代码中getName()为你Hospital类实际的医院名称属性对应的getter方法
public int getHospitalIndexByName(String hospitalName, ArrayList<Hospital> hospitals) {
    for (int i = 0; i < hospitals.size(); i++) {
        Hospital hospital = hospitals.get(i);
        // 字符串比较用equals,避免空指针可增加非空判断
        if (hospitalName.equals(hospital.getName())) {
            return i;
        }
    }
    // 未找到返回-1,调用时需先判断返回值再使用
    return -1;
}

调用示例:

// getHospitalNames()替换为你Vendor类中存储医院名称数组的getter方法
for (String hospitalName : vendor.getHospitalNames()) {
    int index = getHospitalIndexByName(hospitalName, hospitals);
    if (index != -1) {
        Hospital targetHospital = hospitals.get(index);
        // 此处写后续业务逻辑
    } else {
        // 此处写未找到匹配医院的处理逻辑,如日志打印、异常抛出
    }
}

方案2:预构建名称-索引映射(适合大数据量,查询效率高)

如果hospitals列表数据量大、查询频次高,提前构建HashMap存储医院名称与对应索引,后续查询时间复杂度为O(1):

// 初始化hospitals列表后一次性构建映射关系
Map<String, Integer> hospitalNameToIndex = new HashMap<>();
for (int i = 0; i < hospitals.size(); i++) {
    hospitalNameToIndex.put(hospitals.get(i).getName(), i);
}

// 后续直接查询映射即可
for (String hospitalName : vendor.getHospitalNames()) {
    Integer index = hospitalNameToIndex.get(hospitalName);
    if (index != null) {
        Hospital targetHospital = hospitals.get(index);
        // 此处写后续业务逻辑
    } else {
        // 此处写未找到匹配医院的处理逻辑
    }
}

补充注意点

  • 字符串比较必须使用equals(),不能用==,==比对的是字符串内存地址而非内容。
  • 如果业务允许医院名称为空,需增加非空判断避免空指针异常。
  • 无论用哪种方案,都必须先判断索引是否合法,再访问列表元素,避免越界。

内容的提问来源于stack exchange,提问作者MRS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:57:03