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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:59:27