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

如何从ArrayList中删除指定Passenger元素?解决IndexOutOfBoundsException异常求助

解决ArrayList删除指定ID乘客的问题

嘿,我来帮你搞定这个删除乘客的问题!你遇到的IndexOutOfBoundsException和逻辑错误主要有这几个原因:

问题分析

  • 错误1:混淆了「元素ID」和「ArrayList索引」
    你调用的passengerList.remove(id)是ArrayList的按索引删除方法,但你输入的是乘客的ID值(比如1、2、3、4),而ArrayList的索引是从0开始的,当你输入ID=4时,列表当前大小是4,最大索引是3,直接传4自然会触发索引越界异常。
  • 错误2:遍历过程中直接修改列表
    用增强for循环(for-each)遍历ArrayList时,直接调用remove()会触发ConcurrentModificationException(你这里先触发了索引越界,所以没看到这个,但这是潜在问题)。
  • 错误3:循环逻辑错误
    你在遍历每个乘客时都执行一次删除操作,这完全不符合“删除指定ID乘客”的需求,会把列表里的元素乱删一通。

修正方案

下面给你几种可行的实现方式,你可以根据自己的Java版本选择:

方法1:普通for循环(倒序遍历,避免索引错位)

这种方式兼容性最好,适合所有Java版本:

@Override
public void deletePassenger(ArrayList<Passenger> passengerList) {
    System.out.println("---Passengers list--");
    for (Passenger tempPassenger : passengerList) {
        System.out.println(tempPassenger);
    }
    System.out.println("If you want to see options menu, enter 6");
    System.out.println("Enter ID of passenger that you want to delete!");
    int targetId = scanner.nextInt();
    scanner.nextLine();

    // 倒序遍历,避免删除元素后索引错位
    for (int i = passengerList.size() - 1; i >= 0; i--) {
        Passenger p = passengerList.get(i);
        if (p.getId() == targetId) {
            passengerList.remove(i);
            System.out.println("乘客ID " + targetId + " 已成功删除");
            // 如果只需要删除第一个匹配的ID,可以在这里break
            // break;
            return;
        }
    }
    System.out.println("未找到ID为 " + targetId + " 的乘客");
}

方法2:使用迭代器(安全遍历并删除)

迭代器是Java官方推荐的在遍历过程中修改集合的方式,能避免并发修改异常:

@Override
public void deletePassenger(ArrayList<Passenger> passengerList) {
    System.out.println("---Passengers list--");
    for (Passenger tempPassenger : passengerList) {
        System.out.println(tempPassenger);
    }
    System.out.println("If you want to see options menu, enter 6");
    System.out.println("Enter ID of passenger that you want to delete!");
    int targetId = scanner.nextInt();
    scanner.nextLine();

    Iterator<Passenger> iterator = passengerList.iterator();
    boolean deleted = false;
    while (iterator.hasNext()) {
        Passenger p = iterator.next();
        if (p.getId() == targetId) {
            iterator.remove(); // 用迭代器的remove方法,安全删除
            deleted = true;
            System.out.println("乘客ID " + targetId + " 已成功删除");
            // 只删第一个匹配的话可以break
            // break;
        }
    }
    if (!deleted) {
        System.out.println("未找到ID为 " + targetId + " 的乘客");
    }
}

方法3:Java 8+ 使用removeIf(简洁高效)

如果你的项目用Java 8及以上,这种方式最简洁:

@Override
public void deletePassenger(ArrayList<Passenger> passengerList) {
    System.out.println("---Passengers list--");
    passengerList.forEach(System.out::println);
    System.out.println("If you want to see options menu, enter 6");
    System.out.println("Enter ID of passenger that you want to delete!");
    int targetId = scanner.nextInt();
    scanner.nextLine();

    // removeIf接收一个Predicate,匹配的元素会被删除
    boolean deleted = passengerList.removeIf(p -> p.getId() == targetId);
    if (deleted) {
        System.out.println("乘客ID " + targetId + " 已成功删除");
    } else {
        System.out.println("未找到ID为 " + targetId + " 的乘客");
    }
}

额外提示

如果以后需要用passengerList.remove(passengerObject)这种按对象删除的方式,记得在Passenger类里重写equals()和hashCode()方法,比如根据ID来判断两个乘客是否相等:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Passenger passenger = (Passenger) o;
    return getId() == passenger.getId();
}

@Override
public int hashCode() {
    return Objects.hash(getId());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:32:27