web-dev-qa-db-fra.com

Obtenir un article dans la liste en Scala?

Comment dans le monde obtenez-vous juste un élément à l'index i de la liste dans scala?

J'ai essayé get(i) et [i] - rien ne fonctionne. Googler indique uniquement comment "trouver" un élément dans la liste. Mais je connais déjà l'index de l'élément!

Voici le code qui ne compile pas:

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

  }
  return null
}

Regarder le List api n'aide pas, mes yeux se croisent.

184
Andriy Drozdyuk

Utilisez des parenthèses:

data(2)

Mais vous ne voulez pas vraiment faire cela avec des listes, car les listes chaînées prennent du temps à parcourir. Si vous souhaitez indexer dans une collection, utilisez Vector (immuable) ou ArrayBuffer (mutable) ou éventuellement Array (qui n'est qu'un tableau Java, sauf encore vous y indexez avec (i) au lieu de [i]).

275
Rex Kerr

Safer consiste à utiliser lift afin que vous puissiez extraire la valeur si elle existe et échouer normalement.

data.lift(2)

Cela retournera None si la liste n'est pas assez longue pour fournir cet élément, et Some (valeur) si c'est le cas.

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

Chaque fois que vous effectuez une opération qui peut échouer de cette manière, il est bon d'utiliser une option et d'obtenir le système de types pour vous aider à vous assurer que vous gérez le cas où l'élément n'existe pas.

Explication:

Cela fonctionne parce que la apply de List (qui suggère uniquement des parenthèses, par exemple l(index)) ressemble à une fonction partielle qui est définie partout où la liste contient un élément. La méthode List.lift transforme la fonction partielle apply (une fonction définie uniquement pour certaines entrées) en une fonction normale (définie pour toute entrée) en encapsulant le résultat dans une option.

107
adamnfish

Pourquoi des parenthèses?

Voici la citation du livre programmation en scala .

Une autre idée importante illustrée par cet exemple vous expliquera pourquoi les tableaux sont accédés de parenthèses dans Scala. Scala a moins de cas particuliers que Java. Les tableaux sont simplement des instances de classes comme n'importe quelle autre classe de Scala. Lorsque vous appliquez des parenthèses entourant une ou plusieurs valeurs à une variable, Scala transforme le code en un appel d'une méthode nommée apply sur cette variable. Alors greetStrings (i) est transformé en greetStrings.apply (i). Ainsi, accéder à un élément d'un tableau dans Scala est simplement un appel de méthode comme un autre. Ce principe n'est pas limité aux tableaux: toute application d'un objet à certains arguments entre parenthèses sera transformée en appel à une méthode apply. Bien entendu, cela ne compilera que si ce type d'objet définit réellement une méthode apply. Donc ce n'est pas un cas particulier; c'est une règle générale.

Voici quelques exemples montrant comment extraire certains éléments (en premier lieu dans ce cas) en utilisant un style de programmation fonctionnel.

  // 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)
9
B.Mr.W.

Veuillez utiliser parenthesis () pour accéder à la liste des éléments list_name (index)

2