2017-06-07 1 views
1

J'ai deux Seq[Array[Byte]] tableaux:Pour-compréhension pour deux tableaux de la même longueur

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

Je dois muter la o1 Seq des tableaux afin que chaque tableau de o1 est remplacé par tableau de o2 de la même position ssi le tableau de o2 a une longueur non nulle.

Est-il possible de faire avec for-comprehension?

Répondre

5

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) 
}