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

Kotlin实现BubbleSort项目遇ArrayIndexOutOfBoundsException求助

问题定位与修复方案

错误原因分析

从Logcat的ArrayIndexOutOfBoundsException: length=6; index=23可以看出,存在三处核心问题:

  1. 添加元素时未校验数组边界:当count值等于数组长度时,继续执行arr[count] = ...会直接越界访问数组。
  2. 结果遍历逻辑错误:for (i in arr)循环中,i是数组的元素值而非索引,使用arr[i]会把元素值当作索引访问数组(比如元素为23时,数组长度仅为6,索引23不存在)。
  3. 排序时机不合理:每次添加元素就调用冒泡排序,属于无意义的重复计算。

修复后的完整代码

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    // 初始化数组(可根据需求调整长度,或改为动态集合)
    private val arr = IntArray(6)
    private var count = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.Al.setOnClickListener {
            // 校验数组是否还有空间
            if (count < arr.size) {
                // 安全转换输入为整数,避免格式错误
                val inputNum = binding.editTextNumber.text.toString().toIntOrNull()
                inputNum?.let { num ->
                    arr[count] = num
                    count++
                    binding.editTextNumber.setText("") // 清空输入框,优化交互
                } ?: run {
                    Toast.makeText(this, "请输入有效整数", Toast.LENGTH_SHORT).show()
                }
            } else {
                Toast.makeText(this, "数组已满,无法添加更多元素", Toast.LENGTH_SHORT).show()
            }
        }

        binding.Sirala.setOnClickListener {
            binding.textView2.text = "" // 清空之前的显示内容
            // 仅对已添加的元素进行排序(避免包含数组默认的0值)
            val sortedArr = bubbleSort(arr.copyOf(count))
            // 直接遍历排序后的元素并显示
            for (num in sortedArr) {
                binding.textView2.append(" $num")
            }
        }
    }

    private fun bubbleSort(arr: IntArray): IntArray {
        val n = arr.size
        for (i in 0 until n - 1) {
            for (j in 0 until n - i - 1) {
                if (arr[j] > arr[j + 1]) {
                    val temp = arr[j]
                    arr[j] = arr[j + 1]
                    arr[j + 1] = temp
                }
            }
        }
        return arr
    }
}

关键修复点说明

  • 数组边界校验:添加元素前判断count < arr.size,防止越界,同时处理输入非整数的异常情况。
  • 修正遍历逻辑:将for (i in arr)改为直接遍历元素for (num in sortedArr),避免把元素值当作索引使用。
  • 优化排序范围:使用arr.copyOf(count)截取已添加的有效元素进行排序,避免数组中未初始化的默认值(0)干扰结果。
  • 调整排序时机:仅在点击排序按钮时执行排序操作,减少不必要的计算。

内容的提问来源于stack exchange,提问作者birisininkodarsivi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:33:21