假设我有一个集合列表,例如
scala> val a = List(Set(1, 2, 3), Set(4, 5), Set(6, 7, 8, 9))
我想生成一个列表,其中列出了所有可能的项目组合,每个项目都列在列表中(以功能方式)。例如,
List(Set(1, 4, 6), Set(1, 4, 7), ...)
答案 0 :(得分:3)
input.foldLeft(List[Set[Int]](Set.empty)) {
case (acc, set) =>
for {
accSet <- acc
n <- set
} yield accSet + n
}
答案 1 :(得分:1)
为Michael的回答添加一些概括,以涵盖“项目”的要求:
def setCombos[A](xsa: List[Set[A]]): List[Set[A]] =
xsa.foldLeft(List[Set[A]](Set.empty)) {
(acc, set) =>
for {
accSet <- acc
n <- set
} yield accSet + n
}
答案 2 :(得分:0)
object Demo extends App {
def cartesian[T](x: List[List[T]]): List[List[T]] = {
def partialCartesian(x: List[T], y: List[List[T]]): List[List[T]] =
for {
head <- x
tail <- y
} yield head +: tail
x match {
case head :: Nil => head.map(List(_))
case head :: tail => partialCartesian(head, cartesian(tail))
}
}
val a = List(List(1, 2, 3), List(4, 5), List(6, 7, 8, 9))
cartesian(a).foreach(println)
}
>> List(1, 4, 6)
>> List(1, 4, 7)
>> List(1, 4, 8)
>> List(1, 4, 9)
>> List(1, 5, 6)
>> List(1, 5, 7)
>> List(1, 5, 8)
>> List(1, 5, 9)
>> List(2, 4, 6)
>> List(2, 4, 7)
>> List(2, 4, 8)
>> List(2, 4, 9)
>> List(2, 5, 6)
>> List(2, 5, 7)
>> List(2, 5, 8)
>> List(2, 5, 9)
>> List(3, 4, 6)
>> List(3, 4, 7)
>> List(3, 4, 8)
>> List(3, 4, 9)
>> List(3, 5, 6)
>> List(3, 5, 7)
>> List(3, 5, 8)
>> List(3, 5, 9)
我使用&#39; List&#39;没有&#39; Set&#39; - 用于最短的代码。 附:抱歉我的英文。