Заменить элемент в списке с помощью scala
Как заменить элемент по индексу неизменным списком.
например.
val list = 1 :: 2 ::3 :: 4 :: List()
list.replace(2, 5)
Ответы
Ответ 1
В дополнение к тому, что было сказано ранее, вы можете использовать функцию patch
, которая заменяет подпоследовательности последовательности:
scala> val list = List(1, 2, 3, 4)
list: List[Int] = List(1, 2, 3, 4)
scala> list.patch(2, Seq(5), 1) // replaces one element of the initial sequence
res0: List[Int] = List(1, 2, 5, 4)
scala> list.patch(2, Seq(5), 2) // replaces two elements of the initial sequence
res1: List[Int] = List(1, 2, 5)
scala> list.patch(2, Seq(5), 0) // adds a new element
res2: List[Int] = List(1, 2, 5, 3, 4)
Ответ 2
Если вы хотите заменить индекс 2, то
list.updated(2,5) // Gives 1 :: 2 :: 5 :: 4 :: Nil
Если вы хотите найти все места там, где есть 2, и вместо этого поместите 5,
list.map { case 2 => 5; case x => x } // 1 :: 5 :: 3 :: 4 :: Nil
В обоих случаях вы на самом деле не "заменяете", вы возвращаете новый список, который имеет разные элементы в этой (той) позиции (ей).
Ответ 3
Вы можете использовать list.updated(2,5)
(который является методом на Seq
).
Вероятно, лучше использовать scala.collection.immutable.Vector
для этой цели, потому что обновления на Vector
принимают (я думаю) постоянное время.
Ответ 4
Если вы выполняете много таких замен, лучше использовать класс muttable или Array.
Ответ 5
Вы можете использовать карту для создания нового списка, например:
@ list
res20: List[Int] = List(1, 2, 3, 4, 4, 5, 4)
@ list.map(e => if(e==4) 0 else e)
res21: List[Int] = List(1, 2, 3, 0, 0, 5, 0)
Ответ 6
Это также может быть достигнуто с использованием функции патча как
scala> var l = List(11,20,24,31,35)
l: List[Int] = List(11, 20, 24, 31, 35)
scala> l.patch(2,List(27),1)
res35: List[Int] = List(11, 20, 27, 31, 35)
где 2 - это позиция, в которой мы хотим добавить значение, List(27)
- это значение, которое мы добавляем в список, а 1 - количество элементов, подлежащих замене из исходного списка.