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

