如何在Kotlin中将篮子-水果列表映射转换为水果-篮子列表映射
Kotlin实现篮子与水果映射的反转转换
给定以篮子为键、对应水果列表为值的映射,要转换成以水果为键、对应篮子列表为值的映射,有几种简洁的实现方式:
方法一:使用flatMap + groupBy(推荐)
这是Kotlin标准库最常用的组合方式,代码简洁且可读性高:
val basketMap = mapOf( "basket1" to listOf("apples", "oranges", "grapes"), "basket2" to listOf("oranges", "kiwi", "pineapple"), "basket3" to listOf("grapes", "apples", "strawberry") ) // 转换逻辑 val fruitToBaskets = basketMap.flatMap { (basket, fruits) -> // 将每个水果与所属篮子配对,展开成Pair列表 fruits.map { fruit -> fruit to basket } }.groupBy( // 按水果作为分组键 keySelector = { it.first }, // 将每个分组中的篮子提取出来组成列表 valueTransform = { it.second } )
执行后fruitToBaskets的结构就和预期结果完全一致,默认返回的是Map<String, List<String>>类型,属于不可变映射。
方法二:使用fold手动构建映射
如果想更直观地控制每一步的构建过程,可以用fold遍历并组装结果:
val fruitToBaskets = basketMap.fold(mutableMapOf<String, MutableList<String>>()) { acc, (basket, fruits) -> fruits.forEach { fruit -> // 若水果不存在则创建新列表,否则获取已有列表,添加当前篮子 acc.getOrPut(fruit) { mutableListOf() }.add(basket) } acc }.mapValues { it.value.toList() } // 将可变列表转为不可变列表
这种方式适合理解底层的聚合逻辑,最终通过mapValues把值转成不可变列表,保证结果的不可变性。
内容的提问来源于stack exchange,提问作者NEz
相关产品推荐
相关产品推荐

