Как заменить данный элемент в списке? - PullRequest
7 голосов
/ 23 февраля 2011

Это хорошо описывает проблему:

scala> var l2 = List(1,2,3)
l2: List[Int] = List(1, 2, 3)

scala> l2(2) = 55
<console>:10: error: value update is not a member of List[Int]
              l2(2) = 55
              ^

Ответы [ 5 ]

27 голосов
/ 23 февраля 2011

scala.List является неизменным , что означает, что вы не можете обновить его на месте.Если вы хотите создать копию вашего Списка, которая содержит обновленное отображение, вы можете сделать следующее:

val updated = l2.updated( 2, 55 )

В scala.collection.mutable также есть изменяемые типы упорядоченных последовательностей.типа Buffer типов, которые больше похожи на те, которые вы хотите.Если вы попробуете следующее, у вас будет больше успеха:

scala> import scala.collection._
import scala.collection._
scala> val b = mutable.Buffer(1,2,3)
b: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3)
scala> b(2) = 55
scala> b
res1: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 55)

Редактировать: просто заметьте, что в некоторых других ответах упоминалось, что вы должны использовать «изменяемый тип списка» - это правда, но «список»в Scala это просто односвязный список, тогда как в Java он обычно используется для любой упорядоченной коллекции с произвольным доступом.Существует также DoubleLinkedList, который больше похож на Java LinkedList, и MutableList, который является типом, используемым для внутренних объектов некоторых других типов.

Вообще говоря, то, что вы, вероятно, хотите в Scala, - это Buffer для этой работы;тем более, что реализация по умолчанию - ArrayBuffer, что довольно близко к тому же, что и ArrayList, по умолчанию большинства людей в Java.

Если вы когда-нибудь захотите выяснить, что является ближайшим "отображением«Из интерфейса Java-коллекций с миром Scala проще всего, вероятно, просто проверить, что делает JavaConversions .В этом случае вы можете увидеть, что отображение Buffer:

scala.collection.mutable.Buffer <=> java.util.List
3 голосов
/ 24 декабря 2013

Но вы можете скрыть назначение в неявном виде, если вам не нравится updated

 implicit class RichList[A](l: List[A]) {
      def update(which: Int, what: A): List[A] = {
         l.updated(which, what)
      }
 }

 val l = List(1, 2, 3)
 val l2 = l(2) = 55

 List(1, 2, 55)
3 голосов
/ 23 февраля 2011

Список, который вы создаете, является неизменным.

scala> val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)
scala> l.getClass
res3: java.lang.Class[_] = class scala.collection.immutable.$colon$colon

Вместо этого используйте изменяемый список, и все будет в порядке.

2 голосов
/ 23 февраля 2011

Ваша проблема в том, что списки в Scala являются неизменяемыми, вам нужно использовать изменяемый список. Импортируйте scala.collection.mutable.Queue и используйте его вместо этого. Очередь - это MutableList, поэтому она должна делать то, что вы хотите.

0 голосов
/ 20 июня 2017

Списки неизменны в Scala. Но если вы хотите заменить элемент в списке, вы можете использовать «обновленный» метод, подобный этому

val num:List[Int]=List(1,5,4,7,8,2,10)
num=num.updated(0,22)

Поскольку списки являются неизменяемыми, создается копия первого списка с именем num (поскольку мы назначили новый список 'num'), заменяя 0-й элемент на 22. Так что общий обновленный метод -

listname.updated(index,value)
...