2017-06-07 37 views
1

的兩個陣列我有兩個Seq[Array[Byte]]數組:對於-理解爲相同的長度

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

我需要發生變異陣列的o1 SEQ使得o1每個陣列被替換的陣列o2的相同位置iffo2的數組具有非零長度。

是否有可能與理解?

回答

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,因爲它的mu定量方法(update)取一個索引。如果你試圖改變一般的Seq,你可能會因爲鏈接列表ish結構而得到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) 
}