gpt4 book ai didi

scala - 如何计算多重映射的逆

转载 作者:行者123 更新时间:2023-12-02 14:28:05 25 4
gpt4 key购买 nike

我有一个 Scala map : x: [b,c] y: [b,d,e] z: [d,f,g,h]

我想要这张 map 的反面来查找。 b:[x,y] c: [x] d: [x,z] 等等。

有没有办法在不使用中间可变映射的情况下做到这一点

如果它不是多 map - 那么以下工作:

typeMap.flatMap { case (k, v) => v.map(vv => (vv, k))}

最佳答案

编辑:修正答案以包括马斯正确指出的内容。我的答案比他的要长一点,因为我尝试完成每个步骤,而不是将 flatMaps 提供的魔力用于教育目的,他的答案更简单:)

我不确定你的符号。我假设你拥有的是这样的:

val myMap = Map[T, Set[T]] (
x -> Set(b, c),
y -> Set(b, d, e),
z -> Set(d, f, g, h)
)

可以通过如下方式实现反向查找:

val instances = for {
keyValue <- myMap.toList
value <- keyValue._2
}
yield (value, keyValue._1)

此时,您的实例变量是以下类型的列表:

(b, x), (c, x), (b, y) ...

如果您现在这样做:

val groupedLookups = instances.groupBy(_._1)

你得到:

b -> ((b, x), (b, y)),
c -> ((c, x)),
d -> ((d, y), (d, z)) ...

现在我们要减少这些值,以便它们仅包含每对的第二部分。因此我们这样做:

val reverseLookup = groupedLookup.map(_._1 -> _._2.map(_._2))

这意味着对于每一对,我们都保留原始 key ,但我们将参数列表映射到仅具有该对的第二个值的内容。

这就是你的结果。

(你也可以避免分配给中间结果,但我认为这样更清晰)

关于scala - 如何计算多重映射的逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com