为了理解两个相同长度的数组

时间:2017-06-07 16:11:31

标签: scala for-comprehension

我有两个Seq[Array[Byte]]数组:

var o1: Seq[Array[Byte]]
var o2: Seq[Array[Byte]]
//...

我需要 mutate o1 Seq of Arrays,以便o1的每个数组都替换为o2的数组相同位置 iff o2数组的长度非零。

是否可以理解?

1 个答案:

答案 0 :(得分:5)

对于zip

来说,这似乎更好
o1 zip o2 map { case (l, r) => if(r.nonEmpty) r else l }

如果您不喜欢使用o1 zip o2创建中间序列,则可以使用迭代器懒惰地构建组合:

(o1.iterator zip o2.iterator map { case (l, r) => if(r.nonEmpty) r else l }).toList

如果确实想要变异,首先要确保使用collection.mutable.IndexedSeq,因为它的变异方法(update)需要一个索引。如果您尝试改变通用Seq,则由于链接列表结构,您可能会获得O(n)更新。

for {
  (replacement, index) <- o2.iterator.zipWithIndex
  if replacement.nonEmpty
} o1(index) = replacement

这实际上只是语法糖:

o2.iterator.zipWithIndex.foreach {
  case (replacement, index) =>
    if(replacement.nonEmpty) o1.update(index, replacement)
}