如何合并2个列表,使得结果列表在Scala中以交替方式包含2个列表的元素。
输入:
val list1 = List("Mary", "a", "lamb")
val list2 = List("had", "little")
输出:
List("Mary", "had", "a", "little", "lamb")
答案 0 :(得分:16)
您所寻找的通常被称为“穿插”或“插入”,有几种方法可以做到:
def intersperse[A](a : List[A], b : List[A]): List[A] = a match {
case first :: rest => first :: intersperse(b, rest)
case _ => b
}
您也可以使用scalaz
import scalaz._
import Scalaz._
val lst1 = ...
val lst2 = ...
lst1 intercalate lst2
修改:您还可以执行以下操作:
lst1.zipAll(lst2,"","") flatMap { case (a, b) => Seq(a, b) }
考虑到这一点,我相信最后的解决方案是我最喜欢的,因为它最简洁,同时仍然清晰。如果您已经在使用Scalaz,我会使用第二种解决方案。第一个也很可读。
为了使这个答案更加完整,添加@Travis Brown的通用解决方案:
list1.map(List(_)).zipAll(list2.map(List(_)), Nil, Nil).flatMap(Function.tupled(_ ::: _))
答案 1 :(得分:4)
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)
答案 2 :(得分:1)
你可以这样做:
def alternate[A]( a: List[A], b: List[A] ): List[A] = {
def first( a: List[A], b: List[A] ): List[A] = a match {
case Nil => Nil
case x :: xs => x :: second( xs, b )
}
def second( a: List[A], b: List[A] ): List[A] = b match {
case Nil => Nil
case y :: ys => y :: first( a, ys )
}
first( a, b )
}
答案 3 :(得分:0)
list1.zipAll(list2,"","").flatMap(_.productIterator.toList).filter(_ != "")