2011-08-25 13 views
8

Jeśli masz zmienną strukturę danych, taką jak Array, czy można użyć operacji map lub czegoś podobnego do zmiany jej wartości?Mutowanie zbioru zmiennego za pomocą mapy?

Powiedz, że mam val a = Array(5, 1, 3), co najlepiej powiedzieć, odejmując 1 od każdej wartości? Najlepszym Mam wymyślić jest

for(i <- 0 until a.size) { a(i) = a(i) - 1 } 

Przypuszczam sposobem byłoby zrobić tablicę var zamiast val więc mogę powiedzieć

a = a map (_-1) 

edit: dość łatwo toczyć własną rękę, jeśli nic wbudowany, choć nie wiem, w jaki sposób uogólnić do innych modyfikowalnych kolekcjach

scala> implicit def ArrayToMutator[T](a: Array[T]) = new { 
    | def mutate(f: T => T) = a.indices.foreach {i => a(i) = f(a(i))} 
    | } 
ArrayToMutator: [T](a: Array[T])java.lang.Object{def mutate(f: (T) => T): Unit} 

scala> val a = Array(5, 1, 3) 
a: Array[Int] = Array(5, 1, 3) 

scala> a mutate (_-1) 

scala> a 
res16: Array[Int] = Array(4, 0, 2) 

Odpowiedz

17

Jeśli nie dbają o indeksach, chcesz metodę transform.

scala> val a = Array(1,2,3) 
a: Array[Int] = Array(1, 2, 3) 

scala> a.transform(_+1) 
res1: scala.collection.mutable.WrappedArray[Int] = WrappedArray(2, 3, 4) 

scala> a 
res2: Array[Int] = Array(2, 3, 4) 

(Zwraca kopię tablicy tak, że zawinięte łańcuchowym transformacji jest bardziej wydajny, ale oryginalna tablica jest zmodyfikowany jak widać).

+0

Cool, Myślałem, że coś musi być. Wszelkich pomysłów na porównywalną efektywność między tym, sapiąc biblioteki, jak w pytaniu, lub przy użyciu normalnej funkcji? –

+1

@ Luigi Plinge - Jeśli specjalizujesz się w swojej wersji i używasz typów pierwotnych, twoja będzie szybsza (chyba, że ​​trafisz na błąd specjalizacji, którego jest kilka). W przeciwnym razie biblioteka jest równie szybka jak Ty. –

4

Jak na temat korzystania foreach od don” t naprawdę chcesz zwrócić zmodyfikowaną kolekcję, chcesz wykonać zadanie dla każdego elementu. Na przykład:

a.indices.foreach{i => a(i) = a(i) - 1} 

lub

a.zipWithIndex.foreach{case (x,i) => a(i) = x - 1} 
+0

'indices' wydaje się użytecznym sposobem –

Powiązane problemy