2010-04-27 19 views
16
val cross = (for (x<-setA; y<-setB) yield (x,y)) 

val cross2 = (setA flatMap (x => setB map ((x,_))) 

Bunu çapraz ürün operatörü ile yapmak için daha zarif bir yol var mı? Örn:Scala'da 2 kümenin çapraz ürünü

val cross3 = setA cross setB 

cevap

13
import scala.collection.Set 

class 
Crossable[E1](es1: Traversable[E1]) 
{ 
    def 
    ×[E2](es2: Traversable[E2]): Traversable[(E1, E2)] = 
     for (e1 <- es1; e2 <- es2) yield (e1, e2) 

    def 
    cross[E2](es2: Traversable[E2]): Traversable[(E1, E2)] = 
     for (e1 <- es1; e2 <- es2) yield (e1, e2) 
} 


object 
Crossable 
{ 
    implicit 
    def 
    trav2Crossable[E1](es1: Traversable[E1]): Crossable[E1] = 
     new Crossable[E1](es1) 
} 


object 
CrossableTest 
{ 
    def 
    main(args: Array[String]): Unit = { 
     import Crossable.trav2Crossable 

     val es1 = Set(1, 2, 3) 
     val es2 = List("a", "b", "c") 

     (es1 × es2) foreach(printf(" %s%n", _)) 
    } 
} 

% scala -cp . CrossableTest 
    (1,c) 
    (2,b) 
    (3,a) 
    (2,a) 
    (1,a) 
    (3,b) 
    (3,c) 
    (1,b) 
    (2,c) 
+1

Ben böyle ancak standart kütüphanesine yerleşik bir şey vardı umuyordum. Ayrıca, çıkış ilginç bir sırada mı ?! – adam77

+1

es1 bir Küme'dir, bu nedenle sonuç muhtemelen bir Küme de olabilir, bu da sırasını daha fazla veya daha az rastgele hale getirir (tabii ki rasgele değil, yalnızca belirleyici değil, bilmediğimiz değişkenlere bağlı olarak) –