1, "heels" -> 2, "sneakers" -> 3, "dress" -> 4, "jeans" --6ren">
gpt4 book ai didi

Scala 按集过滤

转载 作者:行者123 更新时间:2023-12-04 19:56:26 25 4
gpt4 key购买 nike

假设我有一张看起来像这样的 map

val map = Map("Shoes" -> 1, "heels" -> 2, "sneakers" -> 3, "dress" -> 4, "jeans" -> 5, "boyfriend jeans" -> 6)

而且我还有一个看起来像这样的集合或集合:

val set = Array(Array("Shoes", "heels", "sneakers"), Array("dress", "maxi dress"), Array("jeans", "boyfriend jeans", "destroyed jeans"))

我想在我的 map 上执行过滤操作,以便在我的每个集合中只保留一个元素。预期的输出应该是这样的:

map = Map("Shoes" -> 1, "dress" -> 4 ,"jeans" -> 5)

这样做的目的是,如果我有多个表示不同类别服装的集合,我的输出贴图不会在技术上“重复”相同的对象。

感谢任何帮助,谢谢!

最佳答案

所以首先摆脱你的集合实际上是数组的混淆。对于示例的其余部分,我将改用此定义:

val arrays = Array(Array("Shoes", "heels", "sneakers"), Array("dress", "maxi dress"), Array("jeans", "boyfriend jeans", "destroyed jeans"))

所以从某种意义上说,您有一个由等效对象组成的数组,并且想要删除其中一个以外的所有对象?

首先,您必须找到数组中的哪些元素实际用作 mep 中的键。所以我们只是过滤掉所有不用作键的元素:

array.filter(map.keySet)

现在,我们必须选择一个元素。正如你所说,我们只取第一个:

array.filter(map.keySet).head

由于您的“集合”实际上是数组,因此这实际上是数组中第一个也用作键的元素。如果您实际使用集合,此代码仍然有效,因为集合实际上具有“第一个元素”。它只是高度特定于实现,甚至可能无法确定同一程序的各种执行。至少对于不可变集,它应该在多次调用 head 时是确定性的,即,您应该始终获得相同的元素。

我们实际上对所有其他元素感兴趣,而不是第一个元素,因为我们想从 map 中删除它们:

array.filter(map.keySet).tail

现在,我们只需要从 map 中删除它们:

map -- array.filter(map.keySet).tail

并对所有数组执行此操作:

map -- arrays.flatMap(_.filter(map.keySet).tail)

只要数组不相连,这就可以正常工作。如果不是,我们就不能在每一步都使用初始映射来过滤数组。相反,我们必须使用一个数组来计算一个新 map ,然后从上一个的结果开始获取下一个,依此类推。幸运的是,我们不需要做太多事情:

arrays.foldLeft(map){(m,a) => m -- a.filter(m.keySet).tail}

注意:集合也是从元素到 bool 值的函数,这就是此解决方案有效的原因。

关于Scala 按集过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35230894/

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