Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Scala-以交替方式组合两个列表_List_Scala - Fatal编程技术网

List 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", "

如何合并两个列表,使结果列表以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", "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:空列表的尾部。对于任意数量的列表,这是我遇到的类似问题的例外: