对于相同长度的两个数组的理解
For-comprehension for two arrays of the same length
我有两个 Seq[Array[Byte]]
数组:
var o1: Seq[Array[Byte]]
var o2: Seq[Array[Byte]]
//...
我需要改变数组的o1
序列,以便替换o1
的每个数组o2
的数组具有相同位置 iff o2
的数组具有非零长度。
可以做for-comprehension吗?
这对 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)
}
我有两个 Seq[Array[Byte]]
数组:
var o1: Seq[Array[Byte]]
var o2: Seq[Array[Byte]]
//...
我需要改变数组的o1
序列,以便替换o1
的每个数组o2
的数组具有相同位置 iff o2
的数组具有非零长度。
可以做for-comprehension吗?
这对 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)
}