Istnieje kilka sposobów tworzenia niezmiennej listy w Scali (zobacz poniższy przykładowy kod). Możesz użyć mutowalnego ListBuffera, stworzyć var
listę i zmodyfikować ją, użyć metody rekurencyjnej tail i prawdopodobnie innych, o których nie wiem.
Instynktownie używam ListBuffer, ale nie mam ku temu dobrego powodu. Czy istnieje preferowana lub idiomatyczna metoda tworzenia listy, czy też są sytuacje, w których jedna metoda jest najlepsza?
import scala.collection.mutable.ListBuffer
// THESE are all the same as: 0 to 3 toList.
def listTestA() ={
var list:List[Int] = Nil
for(i <- 0 to 3)
list = list ::: List(i)
list
}
def listTestB() ={
val list = new ListBuffer[Int]()
for (i <- 0 to 3)
list += i
list.toList
}
def listTestC() ={
def _add(l:List[Int], i:Int):List[Int] = i match {
case 3 => l ::: List(3)
case _ => _add(l ::: List(i), i +1)
}
_add(Nil, 0)
}
What you DON'T do is use a List and append to it
Czy to dlatego, że tworzona jest nowa lista ? Zważywszy, że użycie operacji dołączania na początku nie spowoduje utworzenia nowej listy?Nil
. Po drugie, nie ma żadnej kopii na początku: tworzony jest element wskazujący na istniejącą listę i to wszystko.A w prostych przypadkach:
:)
źródło
Uhmm… to wydaje mi się zbyt skomplikowane. Mogę zaproponować
lub
źródło
Chcesz skupić się na niezmienności w Scali, eliminując wszelkie zmienne. Czytelność jest nadal ważna dla twojego bliźniego, więc:
Próbować:
Prawdopodobnie w większości przypadków nie musisz nawet konwertować na listę :)
Zindeksowana sekwencja będzie zawierała wszystko, czego potrzebujesz:
Oznacza to, że możesz teraz pracować nad tym IndexedSeq:
źródło
Vector
jest teraz również domyślnąSeq
implementacją.Zawsze wolę Listę i używam „zwiń / zmniejsz” przed „dla zrozumienia”. Jednak „do zrozumienia” jest preferowane, jeśli wymagane są zagnieżdżone „fałdy”. Rekursja jest ostatnią deską ratunku, jeśli nie mogę wykonać zadania za pomocą "fold / redukuj / dla".
więc dla twojego przykładu zrobię:
zanim to zrobię:
Uwaga: używam tutaj „foldRight (: \)” zamiast „foldLeft (/ :)” ze względu na kolejność „_”. W przypadku wersji, która nie zgłasza wyjątku StackOverflowException, użyj zamiast tego „foldLeft”.
źródło
((0 to 3) :\ List[Int]())(_ :: _)
emoticode?Używając w
List.tabulate
ten sposóbźródło
Uwaga: ta odpowiedź jest napisana dla starej wersji Scali.
Klasy kolekcji Scala zostaną przeprojektowane od wersji Scala 2.8, więc przygotuj się na zmianę sposobu tworzenia list już wkrótce.
Jaki jest zgodny z przyszłością sposób tworzenia listy? Nie mam pojęcia, ponieważ nie przeczytałem jeszcze dokumentów 2.8.
Dokument PDF opisujący proponowane zmiany klas kolekcji
źródło
Jako nowy programista scala napisałem mały test, aby sprawdzić czas tworzenia listy za pomocą sugerowanych powyżej metod. Wygląda na to, że (dla (p <- (0 do x)) wydajność p) toList jest najszybszym podejściem.
źródło
tylko przykład wykorzystujący collection.breakOut
źródło
Aby utworzyć listę ciągów, użyj:
źródło