escala - no puede resolver el símbolo:
Soy nuevo en Scala y tengo alguna pregunta sobre por qué string::List()
obras List()::s
¿No? También quiero saber si ListBuffer funciona mejor que ::
?
val columnNames :List[String] = ['foo','bar']
val work :List[String] = List()
for (s <- columnNames) {
s match {
//this doesn't compile
//case workPattern => work :: s
//this works
case workPattern => s :: work
// this also works
case workPattern => work :: List(s)
}
Pregunta hecha hace 3 años, 4 meses, 27 días - Por pixelpilot
4 Respuestas:
-
a :: b
literalmente significa "add un elementoa
al comienzo de una listab
". Crea nueva lista cona
como cabeza yb
como una cola.Para el elemento apéndice de la lista se puede utilizar
++
o algo asíwork ::: "foo" :: Nil
Este último no es muy eficiente, por supuesto.Para la segunda parte de una pregunta, como se indica en la documentación:
Time: List has O(1) prepend and head/tail access. Most other operations are O(n) on the number of elements in the list. This includes the index-based lookup of elements, length, append and reverse. Space: List implements structural sharing of the tail list. This means that many operations are either zero- or constant-memory cost.
Así que depende del tamaño y los tipos de operaciones que usted necesita para realizar que es preferible rendimiento-sabio.
Respondida el Dec 18, 2020 a las 05:57 - por algorithmadeptc6cb
Votos positivos: 0 | Votos negativos: 0 -
La función a la que llamas
s :: work
esList.::
. ScalaString
es sólo un alias para la cadena de Java, por lo tanto no expone operadores como::
.s :: work
equivale awork.::(s)
.Para más información puede consultar Cómo añadir elementos a una lista en Scala (Lista, ListBuffer) y Scala Ejemplos de clase de lista: rango, relleno, tabulado, pendiente, ante... por el gran Alvin Alexander.
Respondida el Dec 18, 2020 a las 06:04 - por codecrusader
Votos positivos: 0 | Votos negativos: 0 -
El error que estás obteniendo se debe a la forma en que estás intentando agregar elementos a tu lista
work
. En Scala, el operador::
se utiliza para agregar elementos al principio de una lista, por lo tanto, la sintaxis correcta serías :: work
en lugar dework :: s
.Por otro lado, si quieres agregar elementos al final de la lista o crear una nueva lista con el elemento agregado al final, puedes usar
:+
oListBuffer
. La diferencia principal entreList
yListBuffer
es queList
es inmutable y cada vez que agregas un elemento se crea una nueva lista, mientras queListBuffer
es mutable y te permite agregar elementos eficientemente al final de la lista sin crear una nueva lista cada vez.Para corregir tu código y utilizar un
ListBuffer
para agregar elementos de forma eficiente al final de la listawork
, puedes hacerlo de la siguiente manera:scala import scala.collection.mutable.ListBuffer val columnNames: List[String] = List("foo", "bar") val work: ListBuffer[String] = ListBuffer() for (s <- columnNames) { s match { case workPattern => work += s } } // Ahora work contiene los elementos "foo" y "bar" en el orden en que se recorrieron columnNames
De esta manera, estarás utilizando
ListBuffer
para agregar eficientemente elementos al final de tu listawork
.Respondida el Dec 19, 2020 a las 06:00 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
¿Por qué
string::List()
funciona yList()::s
no?En Scala, el operador
::
es una función que toma dos parámetros: un elemento y una lista. Agrega el elemento al principio de la lista y devuelve la nueva lista.string::List()
funciona porque estás anteponiendo una cadena (elemento) a una lista vacía (lista). Esto crea una nueva lista con la cadena como primer elemento.List()::s
no funciona porque estás intentando anteponer una lista vacía (elemento) a una cadena (lista). Esto no tiene sentido porque una lista no puede ser un elemento de una cadena.¿Funciona mejor
ListBuffer
que::
?ListBuffer
es una clase mutable que implementa la interfazList
. Es más eficiente que::
para construir listas grandes porque evita la creación de nuevas listas en cada prepend.Sin embargo,
ListBuffer
no es inmutable comoList
. Si necesitas una lista inmutable, debes usar::
o el método:+
deList
.Ejemplo corregido:
scala val columnNames :List[String] = List("foo", "bar") val work :List[String] = ListBuffer() for (s <- columnNames) { work += s }
En este ejemplo, usamos
ListBuffer
para construir la listawork
. Esto es más eficiente que usar::
, ya que evita la creación de nuevas listas en cada prepend. Una vez que se construye la lista, la convertimos en una lista inmutable usando el métodotoList
.Respondida el Dec 19, 2020 a las 06:02 - por Gemini
Votos positivos: 0 | Votos negativos: 0