【问题标题】:Best way to implement "zipLongest" in Scala在 Scala 中实现“zipLongest”的最佳方法
【发布时间】:2014-08-21 13:40:34
【问题描述】:

我需要在 Scala 中实现一个"zipLongest" 函数;也就是说,将两个序列组合成对,如果一个比另一个长,则使用默认值。 (与标准的zip 方法不同,它只会截断到最短的序列。)

我直接实现如下:

def zipLongest[T](xs: Seq[T], ys: Seq[T], default: T): Seq[(T, T)] = (xs, ys) match {
  case (Seq(), Seq())           => Seq()
  case (Seq(), y +: rest)       => (default, y) +: zipLongest(Seq(), rest, default)
  case (x +: rest, Seq())       => (x, default) +: zipLongest(rest, Seq(), default)
  case (x +: restX, y +: restY) => (x, y) +: zipLongest(restX, restY, default)
}

有没有更好的方法?

【问题讨论】:

    标签: scala collections functional-programming


    【解决方案1】:

    使用zipAll

    scala> val l1 = List(1,2,3)
    l1: List[Int] = List(1, 2, 3)
    
    scala> val l2 = List("a","b")
    l2: List[String] = List(a, b)
    
    scala> l1.zipAll(l2,0,".")
    res0: List[(Int, String)] = List((1,a), (2,b), (3,.))
    

    如果您想对第一个和第二个 seq 使用相同的默认值:

    scala> def zipLongest[T](xs:Seq[T], ys:Seq[T], default:T) = xs.zipAll(ys, default, default)
    zipLongest: [T](xs: Seq[T], ys: Seq[T], default: T)Seq[(T, T)]
    
    scala> val l3 = List(4,5,6,7)
    l3: List[Int] = List(4, 5, 6, 7)
    
    scala> zipLongest(l1,l3,0)
    res1: Seq[(Int, Int)] = List((1,4), (2,5), (3,6), (0,7))
    

    【讨论】:

      【解决方案2】:

      你可以作为一个单行者来做到这一点:

      xs.padTo(ys.length, x).zip(ys.padTo(xs.length, y))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-21
        • 2015-07-11
        • 1970-01-01
        • 2010-10-14
        • 2013-05-08
        • 1970-01-01
        • 2012-05-22
        相关资源
        最近更新 更多