在 Scala 中将 Map[String,List[String]] 展开为笛卡尔积

问题描述

我正在寻找基于地图类型的 Expand a Set[Set[String]] into Cartesian Product in Scala 版本:

我想开始:

val values = Map(
      "id" -> List("Paul","Joe"),"number" -> List("1","2","3"),"Type" -> List("A","B","C")
    )

并计算:

val final = Set(
Map("id" -> "Paul","number" -> "1","Type" -> "A" ),Map("id" -> "Paul","Type" -> "B" ),"Type" -> "C" ),"number" -> "2",....
Map("id" -> "Joe","number" -> "3",Map("id" -> "Joe","Type" -> "C" )
)

我尝试转换以下代码

def combine[A](xs: Traversable[Traversable[A]]): Seq[Seq[A]] =
     xs.foldLeft(Seq(Seq.empty[A])){
     (x,y) => for (a <- x.view; b <- y) yield a :+ b }

我有一些问题要理解如何构造所有地图以添加到大 Set() 中

解决方法

你可以这样做:
(但请注意,对于较大的地图,这会消耗大量内存,因此可能值得考虑生成一个 LazyList

sample(x[!is.na(x)],1)

Scastie 中运行的代码。


顺便说一句,如果你使用cats,你可以这样做:def cartesianProductMap[A,B](data: Map[A,List[B]]): List[Map[A,B]] = data.foldLeft(Map.empty[A,B] :: Nil) { case (acc,(key,values)) => values.flatMap { b => acc.map(_ + (key -> b)) } }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...