如何在 Kotlin 中将 A->Collection<B> 的映射转换为 B->Collection<A>?

问题描述 投票:0回答:1

有没有一种方法,无需使用中间映射,即可反转一对多关联?

例如:我有以下对象:

data class Change(val dependencies: Collection<Revision>)

如果我有一个

Change
对象列表,我可以使用
changes.associateWith { it.dependencies }
轻松生成映射,但是如果我想将依赖项映射到等待它们的所有更改,该怎么办?

目前我正在诉诸使用中间体

MutableMap
,但我希望将其全部发送到标准
Map

kotlin collections
1个回答
0
投票

关于

MutableMap
,所有从现有集合创建新地图的内置方法(例如
associateWith
)都利用底层的中间
MutableMap
来构造新地图。 使用
MutableMap
将意味着创建很多中间不可变映射,这将分配相当多的内存。

我假设您的意思是您不想看到任何

MutableMap
出现在您的代码中

想法是这样的:将映射“扁平化”为修订和更改对的集合 (

Pair<Revision, Change>

),然后按修订对这些对进行分组。

fun transform(changes: Map<Change, List<Revision>>) = changes.flatMap { (change, deps) -> deps.map { it to change } } .groupBy({ it.first }) { it.second }
或者如果您有 

Change

 的集合:

fun transform(changes: Iterable<Change>) = changes.flatMap { change -> change.dependencies.map { it to change } }.groupBy({ it.first }) { it.second } }
如果您不想为每个更改创建新的 

asSequence

,请考虑在 
map
 之前添加 
List
。也就是说,这仍然会产生大量 
Pair
,并且可能会比现有解决方案占用更多内存。

© www.soinside.com 2019 - 2024. All rights reserved.