Wie um alles in der Welt erhalten Sie nur ein Element bei Index i aus der Liste in Scala?
Ich habe es versucht get(i)
und [i]
- nichts funktioniert. Googeln gibt nur zurück, wie ein Element in der Liste "gefunden" wird. Aber ich kenne schon den Index des Elements!
Hier ist der Code, der nicht kompiliert wird:
def buildTree(data: List[Data2D]):Node ={
if(data.length == 1){
var point:Data2D = data[0] //Nope - does not work
}
return null
}
Ein Blick auf die Listen-API hilft nicht, da sich meine Augen nur kreuzen.
Antworten:
Verwenden Sie Klammern:
Aber Sie möchten das nicht wirklich oft mit Listen tun, da das Durchlaufen verknüpfter Listen einige Zeit in Anspruch nimmt. Wenn Sie in eine Sammlung indizieren möchten, verwenden Sie
Vector
(unveränderlich) oderArrayBuffer
(veränderlich) oder möglicherweiseArray
(dies ist nur ein Java-Array, außer Sie indizieren erneut mit(i)
statt[i]
).quelle
ArrayBuffer
funktioniert wieArrayList
.Vector
funktioniert wie ein unveränderlicher -ArrayList
Sie können lesen, aber Sie können nicht schreiben, ohne einen neuen zu erstellen.ArrayBuffer
in eineIndexedSeq
using konvertieren.toIndexedSeq
;IndexedSeq
ist der allgemeinere Typ. (In diesem Fall stellt sich heraus, dass es tatsächlich als. Implementiert istVector
.)IndexedSeq
Ist der Supertyp von Sammlungen, in die eine Indizierung sinnvoll ist. Beachten Sie auch, dass Sie dies tun könnenVector() ++ myArrayBuffer
, was für fast jede Sammlung (auf beiden Seiten) funktioniert.++
Erstellt aus den beiden angegebenen eine neue Sammlung, wobei der Typ der linken beibehalten wird.Vector()
ist der leere Vektor, also würde er produzieren, was Sie wollen.Sicherer ist die Verwendung,
lift
damit Sie den Wert extrahieren können, wenn er vorhanden ist, und ordnungsgemäß fehlschlagen können, wenn dies nicht der Fall ist.Dies gibt None zurück, wenn die Liste nicht lang genug ist, um dieses Element bereitzustellen, und Some (Wert), wenn dies der Fall ist.
Wenn Sie eine Operation ausführen, die auf diese Weise fehlschlägt, sollten Sie eine Option verwenden und das Typsystem verwenden, um sicherzustellen, dass Sie den Fall behandeln, in dem das Element nicht vorhanden ist.
Erläuterung:
Dies funktioniert, weil Listen
apply
(die z. B. nur in Klammern stehenl(index)
) wie eine Teilfunktion sind, die überall dort definiert wird, wo die Liste ein Element enthält. DieList.lift
Methode wandelt die Teilfunktionapply
(eine Funktion, die nur für einige Eingaben definiert ist) in eine normale Funktion (für jede Eingabe definiert) um, indem das Ergebnis im Grunde genommen in eine Option eingeschlossen wird.quelle
Warum Klammern?
Hier ist das Zitat aus der Buchprogrammierung in Scala .
Hier sind einige Beispiele, wie Sie ein bestimmtes Element (in diesem Fall das erste Element) mithilfe eines funktionalen Programmierstils abrufen können.
quelle
Bitte verwenden Sie Klammern (), um auf die Listenelemente Listenname (Index) zuzugreifen.
quelle
Dies ist heutzutage die bevorzugte Methode, um über einen Index auf Daten einer Liste zuzugreifen:
Aber wie Rex Kerr oben ausgeführt hat: Wenn Sie Indizes verwenden, sollten Sie in Betracht ziehen, Vektor anstelle einer Liste zu verwenden.
quelle