2011-02-23 9 views

Respuesta

25

scala.List es inmutable, lo que significa que no puede actualizarlo en su lugar. Si desea crear una copia de su lista que contiene la cartografía actualizada, puede hacer lo siguiente:

val updated = l2.updated(2, 55) 

Hay mutables tipos de secuencias ordenadas, así, en scala.collection.mutable, como Buffer tipos que parecen más como lo que quieres Si intenta lo siguiente que debe tener más éxito:

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) 

Editar: Sólo tener en cuenta que algunas otras respuestas han mencionado que se debe utilizar un "tipo Lista mutable" - esto es cierto, pero la "Lista" en la Scala solo se refiere a la lista de enlaces únicos, mientras que en Java generalmente se usa para cualquier colección ordenada de acceso aleatorio. También hay un DoubleLinkedList, que se parece más a un Java LinkedList, y un MutableList, que es un tipo utilizado para las partes internas de algunos otros tipos.

En general, lo que probablemente desee en Scala es un Buffer para este trabajo; sobre todo porque la implementación predeterminada es ArrayBuffer, que está muy cerca de ser lo mismo que ArrayList, la mayoría de las personas está predeterminado en Java.

Si alguna vez quiere saber cuál es el "mapeo" más cercano de una interfaz de colecciones de Java para el mundo de Scala, lo más fácil es comprobar qué hace JavaConversions. En este caso se puede ver el mapeo es Buffer:

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

esto servirá, gracias val updated = l2.actualizado (2, 55) – Ska

2

Su problema es que las listas de Scala son inmutables, es necesario utilizar una lista mutable en su lugar. Importe scala.collection.mutable.Queue y utilícelo en su lugar. Queue es una MutableList, por lo que debe hacer lo que desee.

+0

necesario utilizar estructura mutable, como se ha señalado por Calum anteriormente, devuelve el método actualizados copia de una lista con elemento dado sustituidos –

2

La lista que está creando es inmutable.

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 

utilizar una lista en lugar mutable y que debe estar bien.

+0

Gracias para ambos pero eso no funcionará ya que estoy trabajando con una API existente que tiene una lista inmutable. Supongo que entonces necesito reemplazar toda la lista para reconstruirla. – Ska

2

Pero se puede envolver la asignación en una implícita si no te gusta 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) = 3 

List(1, 3, 3) 
-1

Las listas son inmutables en Scala. Pero si desea reemplazar un elemento de una lista se puede utilizar el método de "actualización" como esto

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

ya que las listas son inmutables, esto crea una copia de la primera lista llamada num (como hemos asignado la nueva lista de 'num') mediante la sustitución de elemento 0 ª a 22.So el método actualizado genaral es

listname.updated(index,value) 
no
+2

Aunque le agradecemos su respuesta, sería mejor si proporcionara un valor adicional además de las otras respuestas. En este caso, su respuesta no proporciona un valor adicional, ya que otro usuario ya publicó esa solución. Si una respuesta anterior fue útil para usted, debe votarla en lugar de repetir la misma información. –

+0

lo siento, esta es mi primera respuesta en stackoverflow. Escribí lo que entendí sobre el método "actualizado" y pensé que sería útil para otros y no tenía idea de repetirlo. Una vez más, lo siento por repetirlo. –

Cuestiones relacionadas