如何替换列表中的给定项?

时间:2011-02-23 17:12:55

标签: list scala

这很好地描述了这个问题:

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 个答案:

答案 0 :(得分:27)

scala.List immutable ,这意味着您无法就地更新它。如果要创建包含更新映射的列表的副本,可以执行以下操作:

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中的“List”只是指单链表,而在Java中它通常使用对于任何有序的随机访问集合。还有一个DoubleLinkedList,更像是一个Java LinkedList,还有一个MutableList,它是一种用于其他类型内部的类型。

一般来说,您在Scala中可能想要的是Buffer这项工作;特别是因为默认实现是ArrayBuffer,它与ArrayList非常接近,大多数人都是默认的,在Java中。

如果你想知道Java集合接口与Scala世界最接近的“映射”是什么,最简单的方法就是检查JavaConversions的作用。在这种情况下,您可以看到映射到Buffer

scala.collection.mutable.Buffer <=> java.util.List

答案 1 :(得分:3)

您正在创建的列表是不可变的。

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 :(得分:3)

但如果你不喜欢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 :(得分:2)

您的问题是scala中的列表是不可变的,您需要使用可变列表。 导入scala.collection.mutable.Queue并改为使用它。 Queue是一个MutableList,所以它应该做你想要的。

答案 4 :(得分:0)

列表在scala中是不可变的。但是如果你想替换List中的元素,你可以使用&#34;更新&#34;像这样的方法

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

由于Lists是不可变的,因此通过将第0个元素替换为22来创建第一个名为num的List的副本(因为我们将新列表分配给&#39; num&#39;)。因此genaral更新的方法是

listname.updated(index,value)