Заменить элемент в списке на scala - PullRequest
46 голосов
/ 21 февраля 2011

Как заменить элемент по индексу неизменным списком.

Например,

val list = 1 :: 2 ::3 :: 4 :: List()

list.replace(2, 5)

Ответы [ 7 ]

85 голосов
/ 21 февраля 2011

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

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

50 голосов
/ 21 февраля 2011

В дополнение к тому, что было сказано ранее, вы можете использовать функцию 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)
9 голосов
/ 21 февраля 2011

Вы можете использовать list.updated(2,5) (это метод для Seq).

Вероятно, для этой цели лучше использовать scala.collection.immutable.Vector, потому что обновления Vector занимают (я думаю) постоянное время.

1 голос
/ 19 августа 2017

Это также может быть достигнуто с помощью функции исправления как

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 - количество элементов, подлежащих замене из исходного списка.

1 голос
/ 27 декабря 2016

Вы можете использовать карту для создания нового списка, например:

@ 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)
0 голосов
/ 13 октября 2018

Ниже приведен простой пример замены строки в Scala List, вы можете сделать аналогичное для других типов данных

    scala> val original: List[String] = List("a","b")

    original: List[String] = List(a, b)

    scala> val replace = original.map(x => if(x.equals("a")) "c" else x)

    replace: List[String] = List(c, b)
0 голосов
/ 26 февраля 2011

Если вы делаете много таких замен, лучше использовать изменяемый класс или массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...