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

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

크로스 제품 연산자 또는 이와 같은 작업을 수행하는 좀 더 우아한 방법이 있습니까? 예컨대 :스칼라에서 2 세트의 교차 결과

val cross3 = setA cross setB 

답변

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

나는 그것을 좋아하지만 표준 라이브러리에 내장 된 일이 있었다 기대했다. 또한, 출력은 흥미로운 순서로?! – adam77

+1

es1은 Set이기 때문에 결과가 아마도 Set이기도하지만 순서를 다소 불규칙하게 만든다 (당연히 무작위가 아니라 순전히 결정적이지만 우리가 모르는 변수에 따라) –

관련 문제