Java自定义有序列表不使用sort添加元素时出现重复值问题求助
问题定位
你写的add方法存在两个核心错误,直接导致重复输出、排序无效:
- 入参被意外覆盖:你在数组元素交换的逻辑里,直接用了方法入参
item作为临时交换变量,执行item = element[i]后,原本要插入的新值就被数组里已有的旧值覆盖了,最后调用addLast添加的是数组里已经存在的元素,自然会出现重复输出。 - 插入逻辑完全错误:就算你把交换用的临时变量改个名字,现在的逻辑是先给已有元素排序,再把新元素加到数组末尾,新元素根本没有插入到正确的升序位置,最后得到的数组也不是有序的。
另外每次插入都全量冒泡排序的设计效率极低,不符合有序列表插入的设计逻辑,正确的插入逻辑不需要每次全量排序。
修正方案
有序列表升序插入的正确逻辑是:先找到第一个比待插入元素大的位置,把该位置及之后的所有元素统一后移一位,再把新元素放到空出来的位置即可,时间复杂度只有O(n),远优于你现在的O(n²)实现。
修正后的add方法代码如下:
public void add(int item) { // 插入前先判断是否需要扩容 if (isFull()) { doubleTheArray(); } // 1. 查找升序插入位置:第一个比item大的元素的下标 int insertPos = count; // 默认插在末尾 for (int i = 0; i < count; i++) { if (element[i] > item) { insertPos = i; break; } } // 2. 插入位置之后的元素全部后移一位,空出位置 for (int i = count; i > insertPos; i--) { element[i] = element[i - 1]; } // 3. 放入新元素,更新计数 element[insertPos] = item; count++; }
修改后直接删除原方法里的冒泡排序和addLast调用即可,运行主方法得到的输出就是Ordered list of items: [2, 3, 4, 5, 7, 8, 10],符合预期。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

