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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:24:04