2014-11-24 15 views
7

Was wäre der beste Weg, um die folgenden bitte zu erreichen? Ich habe zwei Listen:Scala Permutationen mit zwei Listen

val l1 = List("a", "b") 
val l2 = List(1, 2) 

und ich würde das gerne generieren:

List (
    List(('a', 1), ('b', 1)), 
    List(('a', 1), ('b', 2)), 
    List(('a', 2), ('b', 1)), 
    List(('a', 2), ('b', 2)) 
) 

, die im Grunde die erste Liste mit der zweiten Kombination ist eine Liste der Liste von Tupeln zu schaffen? Ich dachte an die Verwendung eines FoldLeft mit einem Gleiten (2,2), um meine Ergebnisse zu erhalten, kann aber nicht nur das richtige Ergebnis erzielen.

+1

Was haben Sie versucht? Die Lösung ist wirklich einfach. Kann nicht helfen zu denken, dass dies Hausaufgaben ist ... – gzm0

Antwort

11

trickier Die Lösung soll, wie Liste ('a', 'b', 'c') und List ("1", "2")

Dank mit jeder Größe und Art arbeiten, dann dachte ich! Der erste Schritt besteht darin, das n-mal kartesische Produkt von l2 zu berechnen, was mit einer Kombination von List.fill, combinations und permutations möglich ist (ich kann es kaum glauben, dass es keinen einfacheren Weg dafür gibt, aber ich habe t gefunden vorhanden):

def prod[T](lst: List[T], n: Int) = List.fill(n)(lst).flatten.combinations(n).flatMap(_.permutations) 

der Wert von n durch die Größe der Liste l1 bestimmt wird. In Ihrem Beispiel geben prod(l2, 2) uns List(List(1, 1), List(1, 2), List(2, 1), List(2, 2)). Der Rest ist nur eine Anwendung von map und zip. Gemeinsam haben wir

prod(l2, l1.size).map(l1.zip(_)) 

Ausgang für l1 = List('a', 'b', 'c'), l2 = List("1", "2"):

List((a,1), (b,1), (c,1)) 
List((a,1), (b,1), (c,2)) 
List((a,1), (b,2), (c,1)) 
List((a,2), (b,1), (c,1)) 
List((a,1), (b,2), (c,2)) 
List((a,2), (b,1), (c,2)) 
List((a,2), (b,2), (c,1)) 
List((a,2), (b,2), (c,2)) 
+0

Waow. Sehr schön. Eigentlich ziemlich schwierig. Danke für diese schnelle Runde. Habe viel aus deinem Code-Snippet gelernt – jts