Мутирование измененной коллекции с использованием карты?
Если у вас есть изменяемая структура данных, такая как Array
, можно ли использовать операции map
или что-то подобное для изменения ее значений?
Скажем, у меня val a = Array(5, 1, 3)
, что лучший способ сказать, вычитая 1 из каждого значения? Лучшее, что я придумал, это
for(i <- 0 until a.size) { a(i) = a(i) - 1 }
Я полагаю, что путь должен был сделать массив a var
, а не val
, поэтому я могу сказать
a = a map (_-1)
edit: довольно легко свернуть мой собственный, если ничего не встроено, хотя я не знаю, как обобщать другие изменчивые коллекции
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)
Ответы
Ответ 1
Если вам не нужны индексы, вам нужен метод 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)
(Он возвращает копию обернутого массива, чтобы преобразования цепочки были более эффективными, но исходный массив был изменен, как вы можете видеть.)
Ответ 2
Как насчет использования foreach
, так как вы действительно не хотите возвращать измененную коллекцию, вы хотите выполнить задачу для каждого элемента. Например:
a.indices.foreach{i => a(i) = a(i) - 1}
или
a.zipWithIndex.foreach{case (x,i) => a(i) = x - 1}