Comment dans le monde obtenez-vous juste un élément à l'index i de la liste en scala?
J'ai essayé get(i)
, et [i]
- rien ne fonctionne. La recherche sur Google 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 l' API List n'aide pas, car mes yeux se croisent.
Réponses:
Utilisez des parenthèses:
Mais vous ne voulez pas vraiment le faire très souvent avec des listes, car les listes liées prennent du temps à parcourir. Si vous souhaitez indexer dans une collection, utilisez
Vector
(immuable) ouArrayBuffer
(mutable) ou éventuellementArray
(qui est juste un tableau Java, sauf que vous l'indexez avec(i)
au lieu de[i]
).la source
ArrayBuffer
fonctionne commeArrayList
.Vector
fonctionne comme un immuable -ArrayList
vous pouvez lire, mais vous ne pouvez pas écrire sans en créer un nouveau.ArrayBuffer
en uneIndexedSeq
utilisation.toIndexedSeq
;IndexedSeq
est le type le plus générique. (Dans ce cas, il s'avère être implémenté comme unVector
.)IndexedSeq
Est le super-type de collections qu'il est raisonnable d'indexer. Notez également que vous pouvez le faireVector() ++ myArrayBuffer
, ce qui fonctionnera pour presque toutes les collections (de chaque côté).++
crée une nouvelle collection à partir des deux que vous spécifiez, en conservant le type de celle de gauche.Vector()
est le vecteur vide, il produira donc ce que vous voulez.Plus sûr est d'utiliser
lift
afin que vous puissiez extraire la valeur si elle existe et échouer gracieusement dans le cas contraire.Cela retournera None si la liste n'est pas assez longue pour fournir cet élément, et Some (valeur) s'il l'est.
Chaque fois que vous effectuez une opération qui peut échouer de cette façon, il est bon d'utiliser une option et d'obtenir le système de type pour vous assurer que vous gérez le cas où l'élément n'existe pas.
Explication:
Cela fonctionne parce que List
apply
(qui propose des parenthèses, par exemplel(index)
) est comme une fonction partielle qui est définie partout où la liste a un élément. LaList.lift
méthode transforme laapply
fonction partielle (une fonction qui n'est définie que pour certaines entrées) en une fonction normale (définie pour n'importe quelle entrée) en enveloppant essentiellement le résultat dans une option.la source
Pourquoi des parenthèses?
Voici la citation de la programmation du livre en scala .
Voici quelques exemples comment extraire certains éléments (premier élément dans ce cas) en utilisant un style de programmation fonctionnel.
la source
Veuillez utiliser la parenthèse () pour accéder aux éléments de la liste list_name (index)
la source
C'est le moyen préféré pour accéder aux données d'une liste via un index de nos jours:
Mais comme Rex Kerr mentionné ci-dessus: Si vous utilisez des index, vous devriez envisager d'utiliser Vector au lieu d'une liste.
la source