Java冒泡排序未执行最后一轮遍历:ArrayList按成员ID排序失效问题
代码问题根因分析
核心错误1:未实际修改ArrayList中的元素
你代码中交换的s和t只是从ArrayList中取出的局部对象引用副本,交换这两个变量的值完全不会改变ArrayList内部存储的元素顺序,相当于所有交换操作都没有生效。
核心错误2:冒泡排序逻辑结构错误
你写的双层循环不符合冒泡排序的逻辑规则:
- 内层循环没有缩小边界,每次都会完整遍历整个列表,做了大量无效重复判断
- 比较逻辑是固定取外层循环的第i个元素和所有后续元素对比,没有实时对比相邻位置的元素,就算局部变量交换生效也得不到正确排序结果
修复方案
方案1:使用JDK原生工具类实现(推荐)
直接调用Collections.sort方法结合Lambda表达式实现,代码简洁性能更优:
// JDK 8及以上版本 Collections.sort(members, (m1, m2) -> Integer.compare(m1.getId(), m2.getId())); // 也可以直接用List的sort方法 members.sort(Comparator.comparingInt(Member::getId));
方案2:修复后的冒泡排序实现
如果你需要手动实现冒泡排序逻辑,修正后的代码如下:
Member temp; // 外层循环控制排序轮次 for (int i = 0; i < members.size() - 1; i++) { // 内层循环每次把当前未排序区间的最大元素沉到末尾,所以边界逐渐缩小 for (int j = 0; j < members.size() - 1 - i; j++) { // 对比相邻两个位置的元素 if (members.get(j).getId() > members.get(j+1).getId()) { // 交换ArrayList中实际存储的两个位置的元素 temp = members.get(j); members.set(j, members.get(j+1)); members.set(j+1, temp); } } }
内容的提问来源于stack exchange,提问作者Enthu
相关产品推荐
相关产品推荐

