kotlin - 按第二个值对对进行分组,并将其映射到键是第二个元素,值是与第二个元素关联的第一个元素的列表
问题描述
正如我在标题中提到的。我想按第二个值对列表进行分组。我想出了下面的代码可以正常工作,但我想知道是否有可能使用 lambdas 做得更优雅。
val data = mapOf(
Pair("a1", listOf("b1", "b2", "b3", "b4", "b5")),
Pair("a2", listOf("b1", "b7", "b8", "b9", "b10")),
Pair("a3", listOf("b6", "b7", "b8", "b9", "b10")),
Pair("a4", listOf("b6", "b7", "b8", "b9", "b11")),
Pair("a5", listOf("b6", "b2", "b12", "b9", "b13"))
)
val map = mutableMapOf<String, MutableList<String>>()
data.forEach { (k, v) ->
v.forEach {
if (map.containsKey(it)) {
map[it]?.add(k)
} else {
map[it] = mutableListOf(k)
}
}
}
解决方案
根据您给出的示例,预期结果是
{b1=[a1, a2], b2=[a1, a5], b3=[a1], b4=[a1], b5=[a1], b7=[a2, a3, a4], b8=[a2, a3, a4], b9=[a2, a3, a4, a5], b10=[a2, a3], b6=[a3, a4, a5], b11=[a4], b12=[a5], b13=[ a5]}
您可以扩展给定的数据结构,使第二个元素中的每个元素都与第一个元素相关联。但请注意,这会导致额外的空间。分组变得更容易:
data.entries
.flatMap { (k, v) -> v.map { k to it } }
.groupBy(keySelector = Pair<*, *>::second, valueTransform = Pair<*, *>::first) //group by list element, only add key to group
迭代方法可以简化为:
val map = mutableMapOf<String, List<String>>().withDefault { listOf() }
for ((k, v) in data) {
for (e in v) map[e] = map.getValue(e) + k
}
推荐阅读
- sql-server - SQL 查询日期的异常结果
- wordpress - 将 wordpress 和插件与作曲家一起使用
- php - PHP中的倒计时数字数组
- laravel - 迁移命令错误:Illuminate\Database\QueryException:在 sql server 上找不到驱动程序
- mockito - 模拟连续呼叫的不同响应
- react-native - Apollo setContext 无法从服务器保存令牌
- c# - 如何让 ASP.NET Core DI 获得 Simple Injector 解决的依赖关系?
- python - 我无法在 OpenCV 中打开图像
- typescript - 在 TypeScript 中,如何在调用语句后表示非空条件为真?
- javascript - For 循环仅在数组参数上运行一次