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

船舶泊位数组功能异常:无法正确追加元素及移除指定船舶

看起来你在实现船舶泊位管理系统时碰到了两个具体的问题,我来帮你一步步梳理可能的原因和解决办法:

问题1:无法将船舶正确添加至泊位数组的下一个索引位

这个问题大概率出在空位查找逻辑或者泊位数组的初始化方式上,常见原因和解决思路如下:

  • 可能原因:

    • 你没有遍历整个泊位数组寻找第一个空位,而是错误地直接往固定索引(比如数组末尾)添加,或者误用了push方法(泊位数组是固定长度的,push会直接增加数组长度,而非填充已有空位)
    • 泊位数组初始化时没有预留空位标识(比如未用null/undefined占位),导致无法识别哪些位置是空的
  • 解决方案:

    1. 先初始化固定长度的泊位数组,每个空位用null标记:
      // 假设共有5个泊位
      const berths = new Array(5).fill(null);
      
    2. 写一个工具函数,专门查找泊位数组中的第一个空位索引:
      function findFirstEmptyBerth(berths) {
        // 找到第一个为null/undefined的位置
        return berths.findIndex(berth => berth === null || berth === undefined);
      }
      
    3. 添加船舶时先检查空位:
      function addShipToBerth(berths, waitingList, ship) {
        const emptyIndex = findFirstEmptyBerth(berths);
        if (emptyIndex !== -1) {
          berths[emptyIndex] = ship;
          console.log(`${ship.shipName} 已停靠至泊位 ${emptyIndex + 1}`);
        } else {
          waitingList.push(ship);
          console.log(`${ship.shipName} 已加入等待列表`);
        }
      }
      
问题2:离港操作仅能找到数组索引0位置的船舶

这个问题几乎可以肯定是离港时的船舶查找逻辑只检查了索引0,没有遍历整个泊位数组。解决思路如下:

  • 可能原因:

    • 你在查找目标船舶时,直接硬编码访问了berths[0],没有通过循环或数组方法遍历所有泊位匹配船舶标识(比如shipName)
  • 解决方案:

    1. 实现离港函数时,遍历整个泊位数组找到目标船舶的索引:
      function removeShipFromBerth(berths, waitingList, shipName) {
        // 找到匹配shipName的船舶索引(注意判断泊位不为空)
        const shipIndex = berths.findIndex(berth => berth && berth.shipName === shipName);
        if (shipIndex !== -1) {
          const removedShip = berths[shipIndex];
          berths[shipIndex] = null; // 清空该泊位
          console.log(`${removedShip.shipName} 已离港`);
          // 离港后自动触发补位逻辑
          fillEmptyBerth(berths, waitingList);
          return removedShip;
        }
        console.log(`未找到船舶 ${shipName}`);
        return null;
      }
      
    2. 补位逻辑(离港后自动从等待列表取船填充空位):
      function fillEmptyBerth(berths, waitingList) {
        const emptyIndex = findFirstEmptyBerth(berths);
        if (emptyIndex !== -1 && waitingList.length > 0) {
          const nextShip = waitingList.shift(); // 取出等待列表第一个船舶(先进先出)
          berths[emptyIndex] = nextShip;
          console.log(`${nextShip.shipName} 已从等待列表补位至泊位 ${emptyIndex + 1}`);
        }
      }
      
额外注意点
  • 确保船舶的shipName是唯一标识,避免出现同名船舶导致查找错误
  • 等待列表遵循先进先出逻辑,用push添加新船舶,shift取出最前面的船舶,符合排队规则

内容的提问来源于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.21 08:26:12