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

如何在Kotlin中遍历两个不同大小的ArrayList?

问题根源与修复方案

你的java.lang.IndexOutOfBoundsException错误是由两个关键逻辑错误导致的:

  1. 内层循环的j未重置:外层循环每处理一个name1元素时,内层的while(name2.count() > j)会一次性遍历完所有name2元素,之后j的值停在name2的长度上,后续外层循环再执行时,访问name2[j]或Restaurants[j]直接触发越界。
  2. 分支遍历逻辑错误:当name2长度大于name1时,你用while(name2.count() > i)作为外层循环条件,i会增长到name2的长度,但name1更短,此时访问name1[i]必然越界。

修复方案

方案1:兼容不同长度的全量遍历

如果需要处理两个列表的所有元素,不管长度是否一致,取两者的最大长度作为循环次数,每次判断索引是否在有效范围内:

val maxSize = maxOf(name1.size, name2.size)
val priceBreakdown = StringBuilder()
val totalPrice = StringBuilder()

for (index in 0 until maxSize) {
    // 处理name1相关内容,先判断索引是否有效
    if (index < name1.size) {
        priceBreakdown.append("option ${index + 1}:\n${name1[index]}${price1[contador]}$\n")
        totalPrice.append("price ${index + 1}=>\n${hotels[index] * days}$\n")
    }
    // 处理name2相关内容,同样判断索引有效性
    if (index < name2.size) {
        priceBreakdown.append("option ${index + 1}=>\n${name2[index]}${price2[index]}&\n")
        totalPrice.append("price ${index + 1}=>\n${Restaurants[index] * days} Euros\n")
    }
}

方案2:对应元素遍历(若name1与name2一一关联)

如果两个列表的元素是一一对应的,仅某一方有剩余元素,先按最小长度遍历对应元素,再单独处理剩余部分:

val minSize = minOf(name1.size, name2.size)
val priceBreakdown = StringBuilder()
val totalPrice = StringBuilder()

// 遍历对应元素
for (index in 0 until minSize) {
    priceBreakdown.append("option ${index + 1}:\n${name1[index]}${price1[contador]}$\n")
    totalPrice.append("price ${index + 1}=>\n${hotels[index] * days}$\n")
    
    priceBreakdown.append("option ${index + 1}=>\n${name2[index]}${price2[index]}&\n")
    totalPrice.append("price ${index + 1}=>\n${Restaurants[index] * days} Euros\n")
}

// 处理name1的剩余元素
for (index in minSize until name1.size) {
    priceBreakdown.append("option ${index + 1}:\n${name1[index]}${price1[contador]}$\n")
    totalPrice.append("price ${index + 1}=>\n${hotels[index] * days}$\n")
}

// 处理name2的剩余元素
for (index in minSize until name2.size) {
    priceBreakdown.append("option ${index + 1}=>\n${name2[index]}${price2[index]}&\n")
    totalPrice.append("price ${index + 1}=>\n${Restaurants[index] * days} Euros\n")
}

额外优化建议

  • 替换字符串拼接的+=为StringBuilder,避免频繁创建字符串对象,提升性能。
  • 检查变量contador的逻辑,当前代码中它没有递增操作,可能会重复使用price1的同一个元素,需确认是否符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:47