List Scala-以交替方式组合两个列表
如何合并两个列表,使结果列表以Scala中交替的方式包含两个列表的元素 输入:List Scala-以交替方式组合两个列表,list,scala,List,Scala,如何合并两个列表,使结果列表以Scala中交替的方式包含两个列表的元素 输入: val list1 = List("Mary", "a", "lamb") val list2 = List("had", "little") List("Mary", "had", "a", "little", "lamb") 输出: val list1 = List("Mary", "a", "lamb") val list2 = List("had", "little") List("Mary", "
val list1 = List("Mary", "a", "lamb")
val list2 = List("had", "little")
List("Mary", "had", "a", "little", "lamb")
输出:
val list1 = List("Mary", "a", "lamb")
val list2 = List("had", "little")
List("Mary", "had", "a", "little", "lamb")
你可以这样做:
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 )
}
你所寻找的通常被称为“穿插”或“插入”,有几种方法可以做到这一点:
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(_ ::: _))
如果您在列表的结构上进行匹配,而不是使用
head
和tail
.ty(添加了matching@arkonautom,我不认为这是特拉维斯·布朗的想法。检查我的答案是否与上的匹配structure@yan你的的确更好。。。差不多做到了,有+1;)如果列表的长度不同,您的上一个解决方案将不起作用。您需要的是不太优雅的list1.map(List()).zipAll(list2.map(List()),Nil,Nil.flatMap(Function.tupled(:::))
@yan:1st解决方案在第一个列表为空时失败。@TravisBrown修复了最后一个解决方案,但仍然有点优雅(虽然不是泛型)@raHul how?穿插(Nil,List(1,2,3))
=>List(1,2,3)
@yan:Exception in thread“main”java.lang.UnsupportedOperationException:空列表的尾部。对于任意数量的列表,这是我遇到的类似问题的例外: