2016-07-07 2 views
2

Допустим, у меня есть список наборов, напримерГенерация комбинаций с использованием элементов из различных наборов в Scala

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), ...) 
+7

Duplicate, ищите «кросс-продукт» или «продукт», см., Например, https://stackoverflow.com/questions/8217764/cartesian-product-of-two-lists. – uberwach

+0

Какие проблемы вы столкнулись, когда пытались реализовать его самостоятельно? – Dima

ответ

2
input.foldLeft(List[Set[Int]](Set.empty)) { 
    case (acc, set) => 
    for { 
     accSet <- acc 
     n <- set 
    } yield accSet + n 
} 
1

Просто добавив немного обобщения к ответу Майкла, чтобы покрыть потребность в "предметов":

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 
    } 
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) 

Я использую 'Список' не 'Set' - для кратчайшего кода. P.S. Извините за мой английский.