如何合并两个列表Seq,使它从列表1中提取1个元素,然后从列表2中提取1个元素,依此类推,而不是仅将列表2追加到列表1的末尾?
例如
[1,2] + [3,4] = [1,3,2,4]
并不是 [1,2,3,4]
有任何想法吗?concat我看过的大多数方法似乎都是针对后者,而不是针对前者。
尝试
List(1,2)
.zip(List(3,4))
.flatMap(v => List(v._1, v._2))
Run Code Online (Sandbox Code Playgroud)
哪个输出
res0: List[Int] = List(1, 3, 2, 4)
Run Code Online (Sandbox Code Playgroud)
还要考虑以下隐式类
implicit class ListIntercalate[T](lhs: List[T]) {
def intercalate(rhs: List[T]): List[T] = lhs match {
case head :: tail => head :: (rhs.intercalate(tail))
case _ => rhs
}
}
List(1,2) intercalate List(3,4)
List(1,2,5,6,6,7,8,0) intercalate List(3,4)
Run Code Online (Sandbox Code Playgroud)
哪个输出
res2: List[Int] = List(1, 3, 2, 4)
res3: List[Int] = List(1, 3, 2, 4, 5, 6, 6, 7, 8, 0)
Run Code Online (Sandbox Code Playgroud)
你可以做:
val l1 = List(1, 2)
val l2 = List(3, 4)
l1.zip(l2).flatMap { case (a, b) => List(a, b) }
Run Code Online (Sandbox Code Playgroud)
因此,也许您的收藏并不总是相同。zip在那种情况下使用会造成数据丢失。
def interleave[A](a :Seq[A], b :Seq[A]) :Seq[A] =
if (a.isEmpty) b else if (b.isEmpty) a
else a.head +: b.head +: interleave(a.tail, b.tail)
interleave(List(1, 2, 17, 27)
,Vector(3, 4)) //res0: Seq[Int] = List(1, 3, 2, 4, 17, 27)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |