Java中ArrayList存储Emp对象按ID删除时indexOf返回-1问题求助
按ID删除ArrayList中Emp对象的解决方案
问题根因
你调用indexOf(ID)的时候传入的是String类型的ID字符串,但你的Record集合里存储的都是Emp类的实例,两个类型完全不同,默认的equals比较肯定匹配不到,所以永远返回-1。
解决方案
方案1:手动遍历集合查找删除(兼容所有Java版本)
遍历每个Emp对象,匹配ID后删除,同时处理找不到记录的异常场景:
private void btnRemoveActionPerformed(java.awt.event.ActionEvent evt) { String targetId = IDin.getText(); int targetIndex = -1; // 遍历查找对应ID的Emp对象下标 for (int i = 0; i < Record.size(); i++) { if (Record.get(i).ID.equals(targetId)) { targetIndex = i; break; } } if (targetIndex != -1) { Record.remove(targetIndex); Display.setText("remove " + targetId + " Index of " + targetIndex); } else { Display.setText("未找到ID为" + targetId + "的记录"); } }
方案2:Java 8+ 直接使用removeIf方法(代码最简洁)
removeIf会自动删除符合条件的元素,无需手动遍历:
private void btnRemoveActionPerformed(java.awt.event.ActionEvent evt) { String targetId = IDin.getText(); boolean isRemoved = Record.removeIf(emp -> emp.ID.equals(targetId)); if (isRemoved) { Display.setText("已成功删除ID为" + targetId + "的记录"); } else { Display.setText("未找到ID为" + targetId + "的记录"); } }
方案3:重写Emp类的equals方法(适合全局按ID判断Emp相等的场景)
如果你后续所有判断Emp相等的逻辑都是按ID匹配,可以重写equals,之后就能直接用indexOf或者remove(Object o)方法了:
首先修改Emp类:
class Emp { String ID, FName, LName, ASalary, StartDate; Emp(String _ID, String _FName, String _LName, String _ASalary, String _StartDate) { ID = _ID; FName = _FName; LName = _LName; ASalary = _ASalary; StartDate = _StartDate; } // 重写equals方法,按ID判断两个Emp是否相等 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Emp emp = (Emp) o; return ID.equals(emp.ID); } // 重写equals必须同步重写hashCode,遵守Java规范 @Override public int hashCode() { return ID.hashCode(); } }
调整调用逻辑即可:
private void btnRemoveActionPerformed(java.awt.event.ActionEvent evt) { String targetId = IDin.getText(); // 构造一个只有ID的临时Emp对象用来匹配 Emp tempEmp = new Emp(targetId, null, null, null, null); int firstIndex = Record.indexOf(tempEmp); if (firstIndex != -1) { Record.remove(firstIndex); Display.setText("remove " + targetId + " Index of " + firstIndex); } else { Display.setText("未找到ID为" + targetId + "的记录"); } }
注意事项
- 所有删除操作前都要判断下标是否合法,或者是否有匹配的元素,避免抛出
IndexOutOfBoundsException异常 - 如果ID可能为null,要加空值判断避免空指针异常
内容的提问来源于stack exchange,提问作者EverGreat
相关产品推荐
相关产品推荐

