Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
如何将一个序列中的值替换为Scala中另一个序列中的值?_Scala_Functional Programming - Fatal编程技术网

如何将一个序列中的值替换为Scala中另一个序列中的值?

如何将一个序列中的值替换为Scala中另一个序列中的值?,scala,functional-programming,Scala,Functional Programming,我有以下序列: val A = Seq(1,3,0,4,2,0,7,0,6) val B = Seq(8,9,10) 我需要一个新序列,其中0替换为第二个序列中的值: Seq(1,3,8,4,2,9,7,10,6) 如何在函数式中实现这一点?您可以在此处使用map,方法是将所有0替换为b的下一个元素(通过将b转换为迭代器,并使用next): 不确定迭代器是否真正起作用。无论如何,这里有一个选择 val A = Seq(1,3,0,4,2,0,7,0,6) val B = Seq(8,9,

我有以下序列:

val A = Seq(1,3,0,4,2,0,7,0,6)
val B = Seq(8,9,10)
我需要一个新序列,其中0替换为第二个序列中的值:

Seq(1,3,8,4,2,9,7,10,6)

如何在函数式中实现这一点?

您可以在此处使用
map
,方法是将所有0替换为
b
的下一个元素(通过将
b
转换为迭代器,并使用
next
):


不确定迭代器是否真正起作用。无论如何,这里有一个选择

val A = Seq(1,3,0,4,2,0,7,0,6)  
val B = Seq(8,9,10)              
A.foldLeft((B, Seq[Int]())) {case ((b, r), e) => 
          if (e == 0 && ! b.isEmpty) (b.tail, b.head +: r) else (b, e +: r) }
   ._2.reverse
//> res0: Seq[Int] = List(1, 3, 8, 4, 2, 9, 7, 10, 6)
编辑:根据注释进行更新,如果没有B元素,则保留零

编辑2:

模式匹配变体更整洁:

A.foldLeft((B, Seq[Int]())){case ((h +: t, r), 0) =>  (t, h +: r)
                            case ((b, r), e) => (b, e +: r)}
 ._2.reverse
基于


(可能,我没有安装scalaz来测试它)

如果您想查看尾部递归,那么这很适合您

@annotation.tailrec
  def f(l1: Seq[Int], l2: Seq[Int], res: Seq[Int] = Nil): Seq[Int] = {
    if (l1 == Nil) res
    else {
      if (l1.head == 0 && l2 != Nil) f(l1.tail, l2.tail, res :+ l2.head)
      else
        f(l1.tail, l2, res :+ l1.head)
    }
  }

val A = Seq(1, 3, 0, 4, 2, 0, 7, 0, 6)
val B = Seq(8, 9, 10)

scala> f(A,B)
res0: Seq[Int] = List(1, 3, 8, 4, 2, 9, 7, 10, 6)
如果B中的元素用完了

val A = Seq(1, 3, 0, 4, 2, 0, 7, 0, 6)
val B = Seq(8, 9)
scala> f(A,B)
res1: Seq[Int] = List(1, 3, 8, 4, 2, 9, 7, 0, 6)
如果A中的元素小于B

val A = Seq(1, 0)
val B = Seq(8, 9, 10)
scala> f(A,B)
res2: Seq[Int] = List(1, 8)

如果零大于B中的元素,则零保持不变,如果小于B中的元素,则仅使用B中的第一个值。是的,迭代器似乎不起作用。更新为处理B元素的耗尽
val A = Seq(1, 3, 0, 4, 2, 0, 7, 0, 6)
val B = Seq(8, 9)
scala> f(A,B)
res1: Seq[Int] = List(1, 3, 8, 4, 2, 9, 7, 0, 6)
val A = Seq(1, 0)
val B = Seq(8, 9, 10)
scala> f(A,B)
res2: Seq[Int] = List(1, 8)