使用插入排序向有序数组添加对象时元素被覆盖的问题修复咨询
解决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
相关产品推荐
相关产品推荐

