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

实现最多存10个对象的数组按名称字母序存储,解决覆盖问题

问题分析与解决方案

现有代码的核心问题

  1. findIndex逻辑错误:当前仅在数组为空或找到完全匹配的名称时返回有效索引,未找到匹配项时返回-1,导致add方法中无法确定正确的插入位置,进而引发数组越界或元素覆盖问题。
  2. 未正确维护有序性:没有按字母顺序计算插入位置,无法保证数组始终处于有序状态。
  3. 重复元素处理缺失:键值数组要求名称(键)唯一,现有代码未处理重复添加同名对象的场景。

修正后的代码实现

1. 修正findIndex方法

该方法返回按字母序插入的正确位置,同时可检测是否存在同名元素:

private int findIndex(String keyValue) {
    int x = 0;
    // 遍历数组,找到第一个名称大于keyValue的位置
    while (x < mySize) {
        int compareResult = myItems[x].getName().compareToIgnoreCase(keyValue);
        if (compareResult == 0) {
            // 找到同名元素,返回其位置
            return x;
        } else if (compareResult > 0) {
            // 当前元素比目标大,插入到当前位置
            return x;
        }
        x++;
    }
    // 所有元素都比目标小,插入到数组末尾
    return x;
}

2. 修正add方法

处理数组容量限制、重复元素判断,正确移动元素并插入:

public boolean add(ItemMoretti product) {
    if (mySize >= myItems.length) {
        // 数组已满,添加失败
        return false;
    }

    int insertIndex = findIndex(product.getName());
    
    // 检查是否存在同名元素(键重复)
    if (insertIndex < mySize && myItems[insertIndex].getName().equalsIgnoreCase(product.getName())) {
        // 可选逻辑1:替换现有元素
        // myItems[insertIndex] = product;
        // return true;
        // 可选逻辑2:拒绝添加重复元素
        return false;
    }

    // 将插入位置之后的元素向后移动一位
    for (int j = mySize - 1; j >= insertIndex; j--) {
        myItems[j + 1] = myItems[j];
    }

    // 插入新元素
    myItems[insertIndex] = product;
    mySize++;
    return true;
}

3. 数组初始化

确保数组容量固定为10:

private ItemMoretti[] myItems = new ItemMoretti[10];
private int mySize = 0;

关键说明

  • 有序维护:通过compareToIgnoreCase忽略大小写比较名称,找到正确插入位置,保证数组始终按字母序排列。
  • 重复处理:添加时检测到同名元素,可选择替换现有对象或拒绝添加,根据需求调整代码逻辑。
  • 边界处理:先检查数组是否已满,再执行元素移动和插入操作,避免数组越界。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:17:26