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

仅能从dock1数组索引0移除船舶对象问题求助

解决船舶停靠位数组移除对象的问题

嘿,我完全懂你现在的困扰——只能移除dock1数组里第一个位置的船,其他位置的死活删不掉,这事儿确实闹心!咱们直接聚焦你提到的undock()方法里的if语句,大概率是这里的逻辑没处理好数组元素的移动或者遍历逻辑。

先说说最可能犯的错误

我猜你的undock()方法大概是这么写的(典型的新手坑):

public void undock(String shipName) {
    for (int i = 0; i < dock1.length; i++) {
        if (dock1[i] != null && dock1[i].shipName.equals(shipName)) {
            // 只把当前位置设为null,没处理后面的元素
            dock1[i] = null;
            // 或者只移了一次元素就退出
            break;
        }
    }
}

这种写法的问题在于:如果要删的船不在索引0,你只是把那个位置设成了null,但后面的元素没往前挪,数组里就会留个空位,看起来像是没删掉;或者你只处理了第一个匹配项就break,但如果是移动元素的逻辑写错,也会导致只有索引0的元素能被正确移除。

正确的实现方案

根据你用的是普通固定长度数组还是动态列表(ArrayList),我给你两种解决方案:

方案1:如果用的是普通数组(比如Ship[] dock1)

核心思路是:先找到要删除元素的索引,再把后面所有元素依次向前移动一位,最后清空数组最后一个位置的引用。

public void undock(String shipName) {
    int targetIndex = -1;
    // 第一步:遍历找到要移除的船舶的索引
    for (int i = 0; i < dock1.length; i++) {
        if (dock1[i] != null && dock1[i].shipName.equals(shipName)) {
            targetIndex = i;
            break; // 要是想移除所有同名船,就删掉这行
        }
    }

    // 第二步:找到索引后,把后面的元素往前挪
    if (targetIndex != -1) {
        for (int i = targetIndex; i < dock1.length - 1; i++) {
            dock1[i] = dock1[i + 1];
        }
        // 最后把数组末尾设为null,避免残留无效引用
        dock1[dock1.length - 1] = null;
    }
}

方案2:推荐用ArrayList代替普通数组(更省心)

普通数组的长度是固定的,操作起来麻烦,换成ArrayList<Ship>的话,自带的移除方法能帮你省很多事,还不容易出错:

// 先把dock1改成ArrayList类型
private ArrayList<Ship> dock1 = new ArrayList<>();

public void undock(String shipName) {
    // 用迭代器移除,避免遍历中修改数组引发的异常
    for (Iterator<Ship> it = dock1.iterator(); it.hasNext();) {
        Ship ship = it.next();
        if (ship.shipName.equals(shipName)) {
            it.remove();
            break; // 只删第一个就保留,删所有就删掉
        }
    }

    // 要是用Java 8+,还能一行搞定移除所有同名船:
    // dock1.removeIf(ship -> ship.shipName.equals(shipName));
}

再提醒几个容易踩的坑

  • 别直接把目标位置设为null就完事,数组的结构没调整的话,后续遍历会碰到空位,看起来像没删掉元素。
  • 如果用普通数组的for循环删除多个元素,记得调整索引(比如删除后i--),不然会跳过下一个元素。
  • 要是允许停靠同名船舶,记得不要在找到第一个匹配项后就break,不然其他同名船删不掉。

内容的提问来源于stack exchange,提问作者S.smith94

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:49:39