Kotlin实现BubbleSort项目遇ArrayIndexOutOfBoundsException求助
问题定位与修复方案
错误原因分析
从Logcat的ArrayIndexOutOfBoundsException: length=6; index=23可以看出,存在三处核心问题:
- 添加元素时未校验数组边界:当
count值等于数组长度时,继续执行arr[count] = ...会直接越界访问数组。 - 结果遍历逻辑错误:
for (i in arr)循环中,i是数组的元素值而非索引,使用arr[i]会把元素值当作索引访问数组(比如元素为23时,数组长度仅为6,索引23不存在)。 - 排序时机不合理:每次添加元素就调用冒泡排序,属于无意义的重复计算。
修复后的完整代码
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
相关产品推荐
相关产品推荐

