通过交织值合并两个集合

Cli*_*ote 7 collections scala

如何合并两个列表Seq,使它从列表1中提取1个元素,然后从列表2中提取1个元素,依此类推,而不是仅将列表2追加到列表1的末尾?

例如 [1,2] + [3,4] = [1,3,2,4]

并不是 [1,2,3,4]

有任何想法吗?concat我看过的大多数方法似乎都是针对后者,而不是针对前者。

Mar*_*lic 5

尝试

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)


Jea*_*art 5

你可以做:

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)


Krz*_*sik 5

其它的办法:

List(List(1,2), List(3,4)).transpose.flatten
Run Code Online (Sandbox Code Playgroud)


jwv*_*wvh 5

因此,也许您的收藏并不总是相同。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)