Scala - 以交替方式组合两个列表

yAs*_*AsH 12 scala list

如何合并2个列表,使得结果列表在Scala中以交替方式包含2个列表的元素.

输入:

val list1 = List("Mary", "a", "lamb")

val list2 = List("had", "little")
Run Code Online (Sandbox Code Playgroud)

输出:

List("Mary", "had", "a", "little", "lamb")
Run Code Online (Sandbox Code Playgroud)

yan*_*yan 19

您正在寻找的通常被称为"穿插"或"插入",有几种方法可以做到:

def intersperse[A](a : List[A], b : List[A]): List[A] = a match {
  case first :: rest => first :: intersperse(b, rest)
  case _             => b
}
Run Code Online (Sandbox Code Playgroud)

你也可以使用 scalaz

import scalaz._
import Scalaz._

val lst1 = ...
val lst2 = ...

lst1 intercalate lst2
Run Code Online (Sandbox Code Playgroud)

编辑:您还可以执行以下操作:

lst1.zipAll(lst2,"","") flatMap { case (a, b) => Seq(a, b) }
Run Code Online (Sandbox Code Playgroud)

想想看,我相信最后的解决方案是我最喜欢的,因为它最简洁,同时仍然清晰.如果您已经在使用Scalaz,我会使用第二种解决方案.第一个也很可读.

为了使这个答案更加完整,添加@Travis Brown的通用解决方案:

list1.map(List(_)).zipAll(list2.map(List(_)), Nil, Nil).flatMap(Function.tupled(_ ::: _))
Run Code Online (Sandbox Code Playgroud)

  • 如果列表长度不同,你的最后一个解决方案将不起作用 - 你需要更不优雅的`list1.map(List(_)).zipAll(list2.map(List(_)),Nil,无).flatMap(Function.tupled(_ ::: _))`. (2认同)

ark*_*tom 5

val list1 = List("Mary", "a", "lamb")
val list2 = List("had", "little")

def merge1(list1: List[String], list2: List[String]): List[String] = {
    if (list1.isEmpty) list2
    else list1.head :: merge(list2, list1.tail)
}

def merge2(list1: List[String], list2: List[String]): List[String] = list1 match {
    case List() => list2
    case head :: tail => head :: merge(list2, tail)
} 

merge1(list1, list2)
merge2(list1, list2)
//> List[String] = List(Mary, had, a, little, lamb)
Run Code Online (Sandbox Code Playgroud)