2015-11-18 12 views
5

Sagen wir, ich habe eine Liste:Suchen und Ersetzen Artikel in Scala Sammlung

val list = List(1,2,3,4,5) 

Ich möchte alle/erste Elemente ersetzen, die ein Prädikat erfüllen, ich kenne die folgende Art und Weise, es zu tun: (zB ersetzen Sie Zahl, die sogar mit -1)

val filteredList = list.zipWithIndex.filter(_._2 % 2 == 0) 
val onlyFirst = list.updated(filteredList.head._2, -1) 
val all = for(i <- list) yield if(i % 2 ==0) -1 else i 

gibt es eine Sammelfunktion oder nette Scala Art und Weise ist, dass in dieser Situation hilft und hat eine gute Leistung ?

Ich mag auch die Ordnung halten, so will ich nicht filterNot verwenden und andere Elemente zur Liste hinzufügen: (es ist auch nicht effizient)

val onlyFirst = list.filterNot(_ % 2 != 0) ::: list.filter(_ % 2 == 0).map(x => -1) 
+2

Wie wäre es 'Karte'? – JimN

+0

@JimN Karte hat ein Problem für nur die erste – Omid

Antwort

11

Einfach & effizient: Alle ersetzen Artikel

list.map(x => if (x % 2 == 0) -1 else x) 

Ersetzen ein Element

val index = list.indexWhere(_ % 2 == 0) 
list.updated(index, -1) 
+0

Netter Fang, sortiert – jazmit

+1

Welche Sprache ist das? :) Du solltest auch 'then' entfernen. Aber es ist großartig, einfach und effektiv – Archeg

+0

danke lol ... geschrieben zu viel LiveScript & Haskell in letzter Zeit! – jazmit