正如标题中所述。我想按第二个值对对列表进行分组。 我想出了下面的代码,可以正常工作,但是我想知道是否有可能使用lambda使其更优雅。
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)
}
}
}
答案 0 :(得分:1)
根据您给出的示例,预期结果为
{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
}