如何从 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)
通过一系列 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)