2011-02-13 12 views
138

¿Cómo demonios obtienes solo un elemento en el índice i de la lista en scala?Obtiene el artículo en la lista en Scala?

Probé get(i) y [i] - nada funciona. Google solo devuelve cómo "buscar" un elemento en la lista. ¡Pero ya sé el índice del elemento!

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

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

    } 
    return null 
} 

Mirando el List api no ayuda, ya que mis ojos sólo hay que cruzar.

+0

Pues bien, parece que ** ** data.head trabajado ... Pero aún así que sólo me da primer elemento, no cualquiera en la lista. – drozzy

+0

Use ** Seq ** traits ** apply (index) ** si está seguro de que el índice no está fuera de los límites. _http: //www.scala-lang.org/api/current/? _ga = 1.201071334.935145902.1460491527 # scala.collection.Seq_ – Beezer

+0

data.drop (i) .head funciona para acceder al i-ésimo elemento – Vinay

Respuesta

206

Usar paréntesis:

data(2) 

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

+1

Básicamente estoy buscando algo así como ArrayList en Java. Supongo que inmutable también estaría bien. – drozzy

+1

'ArrayBuffer' funciona como' ArrayList'. 'Vector' funciona como una' ArrayList' inmutable: puede leer, pero no puede escribir sin crear uno nuevo. –

+0

¿Qué tal una sublista? Por ejemplo, en Java, hago "data.subList (0, index)". – drozzy

69

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 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 

Cada vez que usted está realizando una operación que puede fallar de esta manera es muy bueno para utilizar una opción y obtener el sistema de tipos para ayudar a asegurarse de que está manejando el caso en que no existe el elemento.

Explicación:

Esto funciona porque Lista de apply (que acaba de azúcares en paréntesis, por ejemplo l(index)) es como una función parcial que se define siempre que 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.

+0

El ascensor es hermoso. Puedo evitar los errores de arrayIndexOutOfBound, sin verificar el tamaño de la matriz. –

8

¿Por qué 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 las matrices con paréntesis en Scala. Scala tiene menos casos especiales que Java. Las matrices 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 aplicar en esa variable. Así que greetStrings (i) se transforma en greetStrings.apply (i). Por lo tanto, acceder a un elemento de una matriz en Scala es simplemente una llamada a método como cualquier otra. Este principio no está restringido a las matrices: cualquier aplicación de un objeto a algunos argumentos entre paréntesis se transformará en una llamada al método apply. Por supuesto, esto compilará solo si ese tipo de objeto realmente define un método de aplicación. Entonces no es un caso especial; es una regla general

Aquí hay 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) 
Cuestiones relacionadas