Для понимания двух массивов одинаковой длины

У меня есть два массива Seq[Array[Byte]]:

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

Мне нужно изменить последовательность o1 массивов, чтобы каждый массив o1 был заменен массивом o2 той же позиции iff массив o2 имеет ненулевую длину.

Можно ли обойтись для понимания?


person St.Antario    schedule 07.06.2017    source источник


Ответы (1)


Кажется, это лучшая работа для 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)
}
person Dylan    schedule 07.06.2017