如何在Kotlin中遍历两个不同大小的ArrayList?
问题根源与修复方案
你的java.lang.IndexOutOfBoundsException错误是由两个关键逻辑错误导致的:
- 内层循环的
j未重置:外层循环每处理一个name1元素时,内层的while(name2.count() > j)会一次性遍历完所有name2元素,之后j的值停在name2的长度上,后续外层循环再执行时,访问name2[j]或Restaurants[j]直接触发越界。 - 分支遍历逻辑错误:当
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
相关产品推荐
相关产品推荐

