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

使用插入排序向有序数组添加对象时元素被覆盖的问题修复咨询

解决Catalog类addItem方法中元素被覆盖的问题

嗨,我一眼就发现你代码里的问题啦!你遇到的“每次添加新对象都会替换已有元素,始终只保留一个”的问题,根源在于**size变量没有在非空数组的插入分支里递增**。

问题分析

  • 当数组为空(size == 0)时,你正确地插入元素并执行了size++,这时候size会变成1,数组的有效元素个数正常更新。
  • 但当数组不为空时,你找到正确位置插入新元素后,完全没修改size变量!这意味着下一次调用addItem时,position依然被初始化为当前的size值(比如始终是1),插入操作会直接覆盖掉之前的元素,数组的实际有效元素个数从来没真正增加过。

修复后的代码

首先是最直接的修复版本,只需要在非空分支里补上size++:

public void addItem(Item theItem) {
    int position = size;
    if(size != 0){
        while (position > 0 && theItem.compareTo(items[position - 1]) < 0){
            items[position] = items[position - 1];
            position--;
        }
        items[position] = theItem;
        // 关键:插入后必须更新数组的有效元素个数
        size++;
    } else{
        items[size] = theItem;
        size++;
    }
}

你还可以优化代码结构,把size++统一放到方法最后,避免重复代码,逻辑更简洁:

public void addItem(Item theItem) {
    int position = size;
    if(size != 0){
        while (position > 0 && theItem.compareTo(items[position - 1]) < 0){
            items[position] = items[position - 1];
            position--;
        }
    }
    items[position] = theItem;
    // 统一更新有效元素个数,不用分分支处理
    size++;
}

额外的compareTo优化建议

你注释里提到想按价格比较,要是需要实现“先按类型→再按编号→最后按价格”的多级排序,可以修改compareTo方法,用更安全的比较方式避免数值溢出:

public int compareTo(Item other){
    // 第一步:比较物品类型
    int typeCompare = this.getItemType().compareTo(other.getItemType());
    if (typeCompare != 0) {
        return typeCompare;
    }
    // 第二步:类型相同时比较编号
    int numCompare = Integer.compare(this.itemnum, other.itemnum);
    if (numCompare != 0) {
        return numCompare;
    }
    // 第三步:编号也相同时比较价格(假设你有getPrice方法)
    return Double.compare(this.getPrice(), other.getPrice());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:25:27