【问题标题】:Cross product of 2 sets in ScalaScala中2套的叉积
【发布时间】:2011-02-13 02:49:46
【问题描述】:
val cross = (for (x<-setA; y<-setB) yield (x,y))

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

有没有更优雅的方法来使用叉积运算符或类似的方法? 例如:

val cross3 = setA cross setB

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:
    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)
    

    【讨论】:

    • 我喜欢这样,但希望标准库中内置了一些东西。另外,输出的顺序很有趣?!
    • es1 是一个集合,所以结果也可能是一个集合,这使得顺序或多或少是随机的(当然它不是随机的,而是纯粹确定性的,但取决于我们不依赖的变量知道)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2014-11-26
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多