Мутирование изменяемой коллекции с помощью карты? - PullRequest
9 голосов
/ 25 августа 2011

Если у вас есть изменяемая структура данных, такая как 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)

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)

Ответы [ 2 ]

18 голосов
/ 25 августа 2011

Если вас не интересуют индексы, вам нужен метод 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)

(Возвращает копию упакованного массива, так что преобразования цепочек более эффективны, но исходный массив изменяется, как вы можете видеть.)

4 голосов
/ 25 августа 2011

Как насчет использования foreach, поскольку вы на самом деле не хотите возвращать измененную коллекцию, вы хотите выполнить задачу для каждого элемента. Например:

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

или

a.zipWithIndex.foreach{case (x,i) => a(i) = x - 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...