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

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

Có cách nào thanh lịch hơn để làm điều này với nhà điều hành sản phẩm chéo hay một số loại như vậy? ví dụ:Sản phẩm chéo của 2 bộ tại Scala

val cross3 = setA cross setB 

Trả lời

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

Tôi thích điều đó nhưng đã hy vọng có một cái gì đó được xây dựng vào thư viện chuẩn. Ngoài ra, đầu ra là một thứ tự thú vị ?! – adam77

+1

es1 là một Set, do đó kết quả có thể là một Set, điều này làm cho thứ tự nhiều hơn hoặc ít ngẫu nhiên hơn (tất nhiên nó không phải ngẫu nhiên, nhưng hoàn toàn là xác định, nhưng tùy thuộc vào các biến chúng ta không biết) –

Các vấn đề liên quan