arreglo array scala collections mutable

arreglo - scala java array



scala adjuntar a una LinkedList mutable (2)

Por favor, chequee esto

import scala.collection.mutable.LinkedList var l = new LinkedList[String] l append LinkedList("abc", "asd") println(l) // prints // LinkedList()

pero

import scala.collection.mutable.LinkedList var l = new LinkedList[String] l = LinkedList("x") l append LinkedList("abc", "asd") println(l) // prints // LinkedList(x, abc, asd)

¿Por qué funciona el segundo fragmento de código pero el primero no? Esto está en Scala 2.10


La documentación dice: If this is empty then it does nothing and returns that. Otherwise, appends that to this. If this is empty then it does nothing and returns that. Otherwise, appends that to this. . Eso es exactamente, lo que observaste. Si realmente necesita una lista mutable, le sugeriría que utilice scala.collection.mutable.ListBuffer en scala.collection.mutable.ListBuffer lugar, con esto puede hacerlo

val lb = new ListBuffer[Int] scala> lb += 1 res14: lb.type = ListBuffer(1) scala> lb res15: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1) scala> lb ++= Seq(1,2,3) res17: lb.type = ListBuffer(1, 1, 2, 3, 1, 2, 3) scala> lb res18: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 1, 2, 3, 1, 2, 3)


Según entiendo, está relacionado con el elemento Primero / Último ( Nil ) en la lista (si la lista está vacía, Nil es el primer y último elemento al mismo tiempo).

LinkedList (todavía) sigue la estrategia de " encanto primitivo ". Por lo tanto, no intenta agregar / agregar datos nuevos a / después de Nil , para tener un posible resultado como este: {Nil, newElement}. (Después de todo Nil debería ser el último elemento)

Por supuesto, se podría verificar if lista está vacía, luego poner addingList al principio y Nil al final. Pero esto sería "demasiado inteligente", supongo.

Pero, de todos modos, append() devuelve un resultado "esperado" como este:

val addingList = new LinkedList[String]("a", "b") val result = emptyList append addingList

result = {"a", "b"}. En este caso, devuelve el ''addistlist'' y / pero no cambia la lista inicial.

Si intentamos asignar newElement a la next referencia:

emptyList.next = LinkedList("whatever")

Como resultado habríamos cambiado emtyList así:

LinkedList(null, whatever)

Es decir , crea un primer elemento como nulo , ya que hemos usado next() asignándole un nuevo elemento / next. Por lo tanto, mueve Nil al final, porque el primer elemento que es nulo, tiene la siguiente referencia al nuevo elemento que agregamos ( addingElelement ).

Porque

"the" emptyList "es también el enlace" head ""

y la cabecera en nuestra cabecera de caso es Nil , pero Nill no puede tener el siguiente, por lo que tiene que crear un primer elemento nuevo (que tiene un valor nulo) con la referencia next () a nuestro nuevo elemento de addingElelement .

Personalmente lo encuentro "demasiado primitivo" y no "muy elegante". Pero depende, supongo.

Historia orientada a la tarea:

Para mi tarea inicial (por qué empiezo a pensar en este comportamiento de lista ''extraño'' [aunque es mutable]), quería usar una lista mutable para una clase / objeto llamado Dictionary que mantendría Words en ella (el diccionario por defecto no lo ha hecho). cualquier palabra). Y tendría métodos como ddWord(wod:String) para agregar nuevas palabras. Por ahora se cambiará mi implementación (no voy a usar esta lista LinkedList , sino la lista MutableList . Parece que es más mutable que la anterior):

object Dictionary { val words = new mutable.MutableList[Word](); def addWord(word: Word): Unit = { words += word; } }

Pero la posible implementación podría ser así:

object Dictionary { var words = new mutable.LinkedList[Word](); def addWord(word: Word): Unit = { if (words.isEmpty) { words = words append( mutable.LinkedList[Word](word) ) // rely on append result } else { words append( mutable.LinkedList[Word](word) ) } } }

Pero luego tengo que usar var lugar de val , y debo transformar cada palabra nueva en LinkedList , y mi lógica se volvió más complicada.