Cela semble être un meilleur travail pour zip
o1 zip o2 map { case (l, r) => if(r.nonEmpty) r else l }
Si vous ne souhaitez pas créer seq intermédiaire avec o1 zip o2
, vous pourriez construire paresseusement la combinaison en utilisant itérateurs:
(o1.iterator zip o2.iterator map { case (l, r) => if(r.nonEmpty) r else l }).toList
Si vous vraiment voulez muter, d'abord assurez-vous d'utiliser un collection.mutable.IndexedSeq
depuis sa mu La méthode de tation (update
) prend un indice. Si vous essayez de muter un Seq
général, vous pouvez obtenir des mises à jour O (n) en raison de structures list-ish liées.
for {
(replacement, index) <- o2.iterator.zipWithIndex
if replacement.nonEmpty
} o1(index) = replacement
Ceci est en fait juste le sucre syntaxe pour quelque chose comme:
o2.iterator.zipWithIndex.foreach {
case (replacement, index) =>
if(replacement.nonEmpty) o1.update(index, replacement)
}