更改列表以在Kotlin中映射,同时自定义此转换

var listOfNums = listOf(1,9,8,25,5,44,7,95,9,10) var mapOfNums = listOfNums.map { it to it+1 }.toMap() println(mapOfNums) 

结果

 {1=2, 9=10, 8=9, 25=26, 5=6, 44=45, 7=8, 95=96, 10=11} 

当我需要这个结果时,它将下一个元素的内容添加到当前元素,而我需要将当前元素映射到下一个元素

我的目标结果

 {1=9, 8=25, 5=44, 7=59, 9=10} 

对于Kotlin 1.1:

首先,使用zip与相邻的对创建一个列表。 然后,在将其转换为Map之前,先放下其他所有对。 喜欢这个:

 val list = listOf(1,9,8,25,5,44,7,95,9,10) val mapOfNums = list.zip(list.drop(1)) .filterIndexed { index, pair -> index % 2 == 0 } .toMap()) 

对于Kotlin 1.2:

Kotlin 1.2带来了chunkedfunction,这将使这一点更容易。 此function将列表分成给定长度的子列表。 你可以这样做:

 val list = listOf(1,9,8,25,5,44,7,95,9,10) val mapOfNums = list.chunked(2).associate { (a, b) -> a to b } 

在RxJava的帮助下

 import io.reactivex.Observable ... val listOfNums = listOf(1,9,8,25,5,44,7,95,9,10) val mapOfNums = Observable.fromIterable(listOfNums) .buffer(2) .map { it[0] to it[1] } .collect( { mutableMapOf() }, { map: MutableMap, (first, second) -> map.put(first, second) } ) .blockingGet() println(mapOfNums) // {1=9, 8=25, 5=44, 7=95, 9=10} 

我们可以跨越每一个第二个索引,并将listOfNums [it]映射到listOfNums [it + 1]

 val listOfNums = listOf(1,9,8,25,5,44,7,95,9,10) val mapOfNums = mutableMapOf() (listOfNums.indices step 2).forEach { mapOfNums[listOfNums[it]] = listOfNums[it + 1] } println(mapOfNums) 

编辑:ephemient建议的另一个更好的解决方案:

  (1..listOfNums.lastIndex step 2).associate { listOfNums[it - 1] to listOfNums[it] } 

优雅!