折叠成一组地图; 如果不存在,则创建地图条目

使用成对的列表,想要将它们转换成集合的映射。

输入:对的列表是这样的

listOf(Pair('bob', UGLY), Pair('sue', PETTY), Pair('bob', FAT)) 

期望的输出是密钥是first对的集合的映射,并且集合是second

 mapOf('bob' to setOf(UGLY, FAT), 'sue' to setOf(PETTY)) 

我已经尝试过,但哇这是非常详细的。 这可以减少?

 fun main(args: Array<String>) { var m = HashMap<Int, MutableSet<Int>>() listOf(1 to 1, 2 to 2, 1 to 3).map { val set = m.getOrPut(it.first, { listOf<Int>().toMutableSet() }) set.add(it.second) set } println (m) } -> {1=[1, 3], 2=[2]} // yet another version, yields the correct result, but I feel a lack of clarity // that maybe I'm missing a library function that would suit the purpose. listOf(1 to 1, 2 to 2, 1 to 3).fold(m, { mapSet, pair -> val set = mapSet.getOrPut(pair.first, { listOf<Int>().toMutableSet() }) set.add(pair.second) mapSet }) -> {1=[1, 3], 2=[2]} 

你可以使用groupBy然后像这样的mapValues

 fun main(args: Array<String>) { val pairs = listOf(Pair("bob", "UGLY"), Pair("sue", "PETTY"), Pair("bob", "FAT")) val result = pairs .groupBy { it.first } .mapValues { it.value.map { p -> p.second }.toSet() } println(result) }