Jak, u licha, dostajesz tylko element o indeksie i z listy w scali?
Próbowałem get(i)
i [i]
- nic nie działa. Googling zwraca tylko sposób „znalezienia” elementu na liście. Ale znam już indeks elementu!
Oto kod, który się nie kompiluje:
def buildTree(data: List[Data2D]):Node ={
if(data.length == 1){
var point:Data2D = data[0] //Nope - does not work
}
return null
}
Spojrzenie na api List nie pomaga, bo moje oczy po prostu się krzyżują.
Odpowiedzi:
Użyj nawiasów:
Ale tak naprawdę nie chcesz tego często robić z listami, ponieważ listy połączone wymagają czasu przejścia. Jeśli chcesz zaindeksować kolekcję, użyj
Vector
(niezmiennej) lubArrayBuffer
(mutowalnej) lub ewentualnieArray
(która jest tylko tablicą Java, z tym wyjątkiem, że ponownie indeksujesz w niej(i)
zamiast zamiast[i]
).źródło
ArrayBuffer
działa jakArrayList
.Vector
działa jak niezmiennyArrayList
- możesz czytać, ale nie możesz pisać bez tworzenia nowego.ArrayBuffer
naIndexedSeq
using.toIndexedSeq
;IndexedSeq
jest bardziej ogólnym typem. (W tym przypadku okazuje się, że jest zaimplementowane jako aVector
.)IndexedSeq
Jest nadtypem kolekcji, do których uzasadnione jest indeksowanie. Pamiętaj też, że możesz to zrobićVector() ++ myArrayBuffer
, co będzie działać dla prawie każdej kolekcji (po obu stronach).++
buduje nową kolekcję z dwóch określonych przez ciebie, zachowując typ z lewej.Vector()
jest pustym wektorem, więc wytworzy to, co chcesz.Bezpieczniej jest używać,
lift
aby można było wyodrębnić wartość, jeśli istnieje, i z wdziękiem, jeśli nie istnieje.Zwróci Brak, jeśli lista nie jest wystarczająco długa, aby zapewnić ten element, a Niektóre (wartość), jeśli tak jest.
Za każdym razem, gdy wykonujesz operację, która może się nie powieść, dobrze jest użyć Opcji i uzyskać system typów, aby upewnić się, że zajmujesz się przypadkiem, w którym element nie istnieje.
Wyjaśnienie:
Działa to, ponieważ List
apply
(który cukry to tylko nawiasy, np.l(index)
) Jest jak funkcja częściowa, która jest definiowana wszędzie tam, gdzie lista ma element.List.lift
Sposób przekształca częściowoapply
funkcję (funkcji, który jest zdefiniowany jedynie przez kilka wejść) do normalnego funkcjonowania (zdefiniowaną dla każdego wejścia) o zasadniczo owijania wynik w opcję.źródło
Dlaczego nawiasy?
Oto cytat z programowania książek w scali .
Oto kilka przykładów, jak wyciągnąć określony element (w tym przypadku pierwszy element) za pomocą funkcjonalnego stylu programowania.
źródło
Użyj nawiasu (), aby uzyskać dostęp do elementów listy nazwa_listy (indeks)
źródło
Jest to obecnie preferowany sposób dostępu do danych Listy za pośrednictwem indeksu:
Ale tak jak Rex Kerr wspomniany powyżej: Jeśli używasz indeksów, powinieneś rozważyć użycie Vector zamiast Listy.
źródło