ArrayList中9元素与上方元素交换功能异常排查求助
问题分析与修正方案
咱们先拆解你代码里的几个核心问题,再给出能跑通的修正方案:
1. 完全错误的元素交换逻辑
你当前的代码把目标索引值当成元素插入列表了,这完全搞反了逻辑!比如测试时目标索引是5,你执行temp.add(nineIndex, indexToSwapTo),相当于把数字5插到了索引8的位置,接着又移除了索引5的原元素(也就是4),最后把9加到索引5——这就导致列表里出现了两个5,根本不是交换元素的操作。
2. 未处理索引越界的边界情况
当9在第一行(索引0、1、2)时,nineIndex -3会得到负数,这时候执行移除/添加操作必然抛出数组越界异常,必须先判断9的位置是否允许向上交换。
3. 索引计算的运算符优先级隐患
indexToSwapTo = temp.indexOf(9) - 3 % 9的运算顺序有问题,%的优先级比-高,实际计算的是nineIndex - (3%9)(也就是nineIndex-3)——虽然这个例子里结果是对的,但写法不严谨,直接写成nineIndex -3更清晰易懂。
修正后的代码
这里给你两种实现方式,都能精准满足需求:
方式一:手动交换元素(逻辑更直观)
case 'u': int nineIndex = temp.indexOf(9); // 先判断9是否不在第一行(索引>=3才能向上交换) if (nineIndex >= 3) { int targetIndex = nineIndex - 3; // 获取两个位置的元素 int nine = temp.get(nineIndex); int upperElement = temp.get(targetIndex); // 交换两个位置的元素 temp.set(nineIndex, upperElement); temp.set(targetIndex, nine); System.out.println("交换后列表: " + temp); } else { System.out.println("9在第一行,无法向上交换"); } break;
方式二:使用Collections工具类(代码更简洁)
import java.util.Collections; // ... 其他业务代码 ... case 'u': int nineIndex = temp.indexOf(9); if (nineIndex >= 3) { int targetIndex = nineIndex - 3; // 直接调用工具类完成交换 Collections.swap(temp, nineIndex, targetIndex); System.out.println("交换后列表: " + temp); } else { System.out.println("9在第一行,无法向上交换"); } break;
测试验证
用你给出的初始列表[6,1,8,3,7,4,2,5,9]测试:
- nineIndex是8,满足
>=3的条件,targetIndex为8-3=5 - 交换索引5和8的元素(4和9),最终列表会变成
[6,1,8,3,7,9,2,5,4],完全符合你要的“9和上方元素交换”的需求。
内容的提问来源于stack exchange,提问作者MotorBlade
相关产品推荐
相关产品推荐

