为何ArrayList无法直接用IntRange索引却可在for循环中使用?
IntRange索引ArrayList的差异原因与解决方法
为什么直接用gun[gunIndex]会报错
ArrayList的[]运算符(对应get()方法)设计为接收单个Int类型的索引,用来获取列表中某一个位置的元素。而你定义的gunIndex是IntRange类型(一个范围值),和方法要求的Int类型不匹配,所以编译器直接抛出类型不匹配的错误。
为什么for循环里能用IntRange
Kotlin的for循环在遍历IntRange时,会自动把这个范围拆解成一个个独立的Int值。比如for (i in gunIndex)其实等价于依次把0、1、2、3、4赋值给i,循环体内的gun[i]是用单个Int索引访问元素,完全符合get()方法的参数要求,自然不会报错。
不用循环获取范围内所有元素的方法
如果想一次性拿到gunIndex范围内的所有元素,不用手动写循环,可以用Kotlin集合的扩展函数:
方法1:使用slice()函数
slice()接收一个IntRange参数,返回包含对应索引元素的新列表:
fun main(args: Array<String>) { var gun = arrayListOf<String>("ak47", "m249 SAW", "Dessert Eagle") gun.add("AKM") gun.add("AK74") var gunIndex = 0..gun.size-1 val selectedGuns = gun.slice(gunIndex) println(selectedGuns) // 输出:[ak47, m249 SAW, Dessert Eagle, AKM, AK74] }
方法2:使用subList()方法
subList()接收起始索引和结束索引(左闭右开),返回原列表的子视图(修改子列表会影响原列表):
fun main(args: Array<String>) { var gun = arrayListOf<String>("ak47", "m249 SAW", "Dessert Eagle") gun.add("AKM") gun.add("AK74") var gunIndex = 0..gun.size-1 val selectedGuns = gun.subList(gunIndex.first, gunIndex.last + 1) println(selectedGuns) // 输出:[ak47, m249 SAW, Dessert Eagle, AKM, AK74] }
内容的提问来源于stack exchange,提问作者getchwaltzetki
相关产品推荐
相关产品推荐

