2012-07-30 12 views
14

Vorrei creare una raccolta con tuple contenenti tutte le combinazioni a coppie di due elenchi. Qualcosa di simile:scala: produce combinazioni a coppie di due anelli

for (x <- xs) 
    for (y <- ys) 
    yield (x,y) 

In Python questo avrebbe funzionato, a Scala apparentemente solo for rendimenti per l'ultimo ciclo (quindi questo restituisce Unit)

Qual è il modo più pulito per la sua attuazione a Scala?

+3

La risposta di Nicolas è corretta, ma si noti che 'for' valuta l'Unità solo quando non c'è rendimento. Controlla 'for (x <- xs) yield per (y <- ys) yield (x, y)', restituisce qualcosa di interessante, ma non esattamente quello che vuoi. –

risposta

25

Si erano quasi arrivati:

scala> val xs = List (1,2,3) 
xs: List[Int] = List(1, 2, 3) 

scala> val ys = List (4,5,6) 
ys: List[Int] = List(4, 5, 6) 

scala> for (x <- xs; y <- ys) yield (x,y) 
res3: List[(Int, Int)] = List((1,4), (1,5), (1,6), (2,4), (2,5), (2,6), (3,4), (3,5), (3,6)) 
9

Un po 'più esplicito in base a Nicolas:
In Scala è possibile utilizzare più generatori in un singolo per-comprensione.

val xs = List(1,2,3) 
val ys = List(4,5) 

for { 
    x <- xs 
    y <- ys 
} yield (x,y) 

res0: List[(Int, Int)] = List((1,4), (1,5), (2,4), (2,5), (3,4), (3,5)) 

È anche possibile valutare nella comprensione.

for { 
    x <- xs 
    y <- ys 
    if (x + y == 6) 
} yield (x,y) 

res1: List[(Int, Int)] = List((1,5), (2,4)) 

Oppure effettuare un incarico.

for { 
    x <- xs 
    y <- ys 
    val z = x + y 
} yield (x,y,z) 

res2: List[(Int,Int,Int)] = List((1,4,5), (1,5,6), (2,4,6), (2,5,7), (3,4,7), (3,5,8)) 
+0

E se mi piacerebbe eseguire il ciclo di 'xs' e' ys' _and_ incrementare il contatore 'cnt' ad ogni iterazione? Come: 'for (x <-xs; y <-ys; cnt ++) yield (x, y, cnt)'? –

+1

val concatenator = per {x <- xs, y <- ys} yield (x, y); concatenator.zipWithIndex. Potresti appiattire questo risultato ma viene contato. –

+1

per- le comprensioni sono belle, le sto scoprendo anche per me stesso, e mi piacciono molto specialmente con le convalide di scalaz – Alex

Problemi correlati