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

Java自定义有序列表不使用sort添加元素时出现重复值问题求助

问题定位

你写的add方法存在两个核心错误,直接导致重复输出、排序无效:

  1. 入参被意外覆盖:你在数组元素交换的逻辑里,直接用了方法入参item作为临时交换变量,执行item = element[i]后,原本要插入的新值就被数组里已有的旧值覆盖了,最后调用addLast添加的是数组里已经存在的元素,自然会出现重复输出。
  2. 插入逻辑完全错误:就算你把交换用的临时变量改个名字,现在的逻辑是先给已有元素排序,再把新元素加到数组末尾,新元素根本没有插入到正确的升序位置,最后得到的数组也不是有序的。
    另外每次插入都全量冒泡排序的设计效率极低,不符合有序列表插入的设计逻辑,正确的插入逻辑不需要每次全量排序。
修正方案

有序列表升序插入的正确逻辑是:先找到第一个比待插入元素大的位置,把该位置及之后的所有元素统一后移一位,再把新元素放到空出来的位置即可,时间复杂度只有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:54:03