gpt4 book ai didi

scala - 在 Scala 中实现 "zipLongest"的最佳方式

转载 作者:行者123 更新时间:2023-12-03 18:33:10 30 4
gpt4 key购买 nike

我需要在 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)
}

有没有更好的方法来做到这一点?

最佳答案

使用 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))

关于scala - 在 Scala 中实现 "zipLongest"的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25427879/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com