Obtener artículo en la lista en Scala?


¿Cómo en el mundo se obtiene solo un elemento en index i de la Lista en scala?

Intenté get(i), y [i] - nada funciona. Googlear solo devuelve cómo "encontrar" un elemento en la lista. ¡Pero ya conozco el índice del elemento!

Aquí está el código que no compila:

def buildTree(data: List[Data2D]):Node ={
  if(data.length == 1){
      var point:Data2D = data[0]  //Nope - does not work

  }
  return null
}

Mirar la api de la lista no ayuda, ya que mis ojos simplemente se cruzan.

 158
Author: Ben Reich, 2011-02-13

4 answers

Use paréntesis:

data(2)

Pero realmente no quieres hacer eso con listas muy a menudo, ya que las listas enlazadas tardan tiempo en recorrerse. Si desea indexar en una colección, use Vector (inmutable) o ArrayBuffer (mutable) o posiblemente Array (que es solo una matriz Java, excepto que nuevamente indexa en ella con (i) en lugar de [i]).

 237
Author: Rex Kerr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-13 00:59:02

Más seguro es usar lift para que pueda extraer el valor si existe y fallar correctamente si no lo hace.

data.lift(2)

Esto devolverá None si la lista no es lo suficientemente larga como para proporcionar ese elemento, y Some(value) si lo es.

scala> val l = List("a", "b", "c")
scala> l.lift(1)
Some("b")
scala> l.lift(5)
None

Siempre que esté realizando una operación que puede fallar de esta manera, es genial usar una Opción y obtener el sistema de tipos para asegurarse de que está manejando el caso en el que el elemento no existe.

Explicación:

Esto funciona porque List's apply (que se añade a solo paréntesis, por ejemplo l(index)) es como una función parcial que se define donde la lista tiene un elemento. El método List.lift convierte la función parcial apply (una función que solo está definida para algunas entradas) en una función normal (definida para cualquier entrada) básicamente envolviendo el resultado en una Opción.

 84
Author: adamnfish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-03 17:23:28

¿Por qué los paréntesis?

Aquí está la cita del libro programming in scala.

Otra idea importante ilustrada por este ejemplo le dará una idea de por qué se accede a los arrays con paréntesis en Scala. Scala tiene menos casos especiales que Java. Los arrays son simplemente instancias de clases como cualquier otra clase en Scala. Cuando aplica paréntesis que rodean uno o más valores a una variable, Scala transformará el código en una invocación de un método llamado apply en esa variable. Así que greetStrings (i) se transforma en greetStrings.aplicar(i). Por lo tanto, acceder a un elemento de una matriz en Scala es simplemente una llamada a un método como cualquier otro. Este principio no se limita a los arrays: cualquier aplicación de un objeto a algunos argumentos entre paréntesis se transformará en una llamada al método apply. Por supuesto, esto se compilará solo si ese tipo de objeto realmente define un método apply. Así que no es un caso especial; es una regla general.

Aquí están algunos ejemplos de cómo tirar de cierto elemento (primer elemento en este caso) utilizando el estilo de programación funcional.

  // Create a multdimension Array 
  scala> val a = Array.ofDim[String](2, 3)
  a: Array[Array[String]] = Array(Array(null, null, null), Array(null, null, null))
  scala> a(0) = Array("1","2","3")
  scala> a(1) = Array("4", "5", "6")
  scala> a
  Array[Array[String]] = Array(Array(1, 2, 3), Array(4, 5, 6))

  // 1. paratheses
  scala> a.map(_(0))
  Array[String] = Array(1, 4)
  // 2. apply
  scala> a.map(_.apply(0))
  Array[String] = Array(1, 4)
  // 3. function literal
  scala> a.map(a => a(0))
  Array[String] = Array(1, 4)
  // 4. lift
  scala> a.map(_.lift(0))
  Array[Option[String]] = Array(Some(1), Some(4))
  // 5. head or last 
  scala> a.map(_.head)
  Array[String] = Array(1, 4)
 8
Author: B.Mr.W.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-30 06:03:58

Utilice paréntesis () para acceder a los elementos de la lista list_name (índice)

 1
Author: Deepan Chakravarthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-21 09:22:04