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
相关产品推荐
相关产品推荐

