如何从 Scala 中的映射键获取值的公共元素?

How to get common elements of values from map keys in Scala?

通过一系列 Scala 练习可以更好地理解高阶函数。我遇到过这个问题。我有以下地图:

val keyValues = Map("a" -> List(1, 3), "b" -> List(1), "c" -> List(1,3,4,5))

我怎样才能得到一个列表,其中包含所有 3 个键值列表的公共元素,即:

val common = List(1)

我怎样才能得到一个包含键值的所有元素的列表:

val all = List(1,3,4,5)

我是函数式编程的新手,所以如果有人能帮助我理解它背后的逻辑,我将不胜感激。提前致谢!

您可以使用 intersect:

keyValues.values.reduce((l1, l2) => l1.intersect(l2))

并获得全部:

keyValues.values.map(_.toSet).reduce((s1, s2) => s1 ++ s2).toList

恕我直言,Sets 是解决此类问题的绝佳数据结构。

val keyValues = Map("a" -> List(1, 3), "b" -> List(1), "c" -> List(1,3,4,5))

val valuesAsSets = keyValues.valuesIterator.map(_.toSet).toList

val all = valuesAsSets.foldLeft(Set.empty[Int])(_ | _)
val all = valuesAsSets.foldLeft(Set.empty[Int]) { case (acc, set) => acc.union(set) }
// all: Set[Int] = Set(1, 3, 4, 5)

val common = all.filter(elem => valuesAsSets.forall(set => set.contains(elem)))
// common: Set[Int] = Set(1)