更改列表以在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带来了chunked
function,这将使这一点更容易。 此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] }
优雅!
- 如何添加kotlin类到gradle JavaCompile任务
- MapDB ClassNotFoundException:kotlin.jvm.internal.Intrinsics
- 从Parcelable类读取和写入java.util.Date
- 我现在正在用Kotlin开发一个Android应用程序,但是发生了一个错误:CompilationException:无法将方法调用“readText”内联到
- (Java + Kotlin)自动assembly(Autowiring):预计至少有1个bean可以作为这个依赖关系的autowire候选者
- Kotlin文件从Jar打开而不是Project:IntelliJ
- 谷歌Gson – 反序列化列表<class>对象? (通用型)
- 将TypeScript转换为Java
- Android:创建较短版本的findViewById – 未经检查的转换