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