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

将Map[String,List[String]]展开为Scala中的笛卡尔乘积,list,scala,combinations,cartesian-product,cartesian,List,Scala,Combinations,Cartesian Product,Cartesian,我正在寻找基于地图类型的版本: 首先,我想谈谈: val values = Map( "id" -> List("Paul","Joe"), "number" -> List("1","2","3"), "Type" -> List("A","B"

我正在寻找基于地图类型的版本:

首先,我想谈谈:

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", "number" -> "1", "Type" -> "B" ),
Map("id" -> "Paul", "number" -> "1", "Type" -> "C" ),
Map("id" -> "Paul", "number" -> "1", "Type" -> "A" ),
Map("id" -> "Paul", "number" -> "1", "Type" -> "B" ),
Map("id" -> "Paul", "number" -> "1", "Type" -> "C" ),
Map("id" -> "Paul", "number" -> "2", "Type" -> "A" ),
Map("id" -> "Paul", "number" -> "2", "Type" -> "B" ),
Map("id" -> "Paul", "number" -> "2", "Type" -> "C" ),
....
Map("id" -> "Joe", "number" -> "3", "Type" -> "B" ),
Map("id" -> "Joe", "number" -> "3", "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 }
def combine[A](xs:Traversable[Traversable[A]]):Seq[Seq[A]]=
xs.foldLeft(序号(序号空[A])){

(x,y)=>对于(a你可以这样做:
(但请注意,对于较大的地图,这将消耗大量内存,因此可能值得研究生成一个懒散列表(LazyList)

def cartesianProductMap[A,B](数据:Map[A,List[B]]):List[Map[A,B]]=
data.foldLeft(Map.empty[A,B]::Nil){
案例(acc,(键,值))=>
values.flatMap{b=>
acc.map(+(键->b))
}
}

正在运行的代码



顺便说一句,如果你使用猫,你可以做:
values.to(SortedMap.sequence
你可以做这样的事情:
(但请注意,对于较大的地图,这将消耗大量内存,因此可能值得研究生成一个懒散列表(LazyList)

def cartesianProductMap[A,B](数据:Map[A,List[B]]):List[Map[A,B]]=
data.foldLeft(Map.empty[A,B]::Nil){
案例(acc,(键,值))=>
values.flatMap{b=>
acc.map(+(键->b))
}
}

正在运行的代码


顺便说一句,如果你使用猫,你可以做:
values.to(SortedMap.sequence