实现最多存10个对象的数组按名称字母序存储,解决覆盖问题
问题分析与解决方案
现有代码的核心问题
- findIndex逻辑错误:当前仅在数组为空或找到完全匹配的名称时返回有效索引,未找到匹配项时返回-1,导致add方法中无法确定正确的插入位置,进而引发数组越界或元素覆盖问题。
- 未正确维护有序性:没有按字母顺序计算插入位置,无法保证数组始终处于有序状态。
- 重复元素处理缺失:键值数组要求名称(键)唯一,现有代码未处理重复添加同名对象的场景。
修正后的代码实现
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
相关产品推荐
相关产品推荐

