Saya akan sedikit memperluas komentar saya. The List[T]
struktur data, dari scala.collection.immutable
dioptimalkan untuk bekerja dengan cara yang daftar kekal di lebih murni fungsional karya bahasa pemrograman. Hal ini telah sangat cepat tambahkan kali, dan diasumsikan bahwa Anda akan bekerja di kepala untuk hampir semua akses Anda.
Daftar yang tidak dapat diubah memiliki waktu prependensi yang sangat cepat karena fakta bahwa mereka memodelkan daftar tertaut mereka sebagai serangkaian "sel kontra". Sel mendefinisikan nilai tunggal, dan penunjuk ke sel berikutnya (gaya daftar tunggal-tertaut klasik):
Cell [Value| -> Nil]
Saat Anda menambahkan ke daftar, Anda benar-benar hanya membuat satu sel baru, dengan sisa daftar yang ada diarahkan ke:
Cell [NewValue| -> [Cell[Value| -> Nil]]
Karena daftar ini tidak dapat diubah, Anda aman untuk melakukan ini tanpa menyalin yang sebenarnya . Tidak ada bahaya perubahan daftar lama dan menyebabkan semua nilai dalam daftar baru Anda menjadi tidak valid. Namun, Anda kehilangan kemampuan untuk memiliki pointer yang bisa berubah ke akhir daftar Anda sebagai kompromi.
Ini cocok untuk bekerja secara rekursif pada daftar. Katakanlah Anda mendefinisikan versi Anda sendiri filter
:
def deleteIf[T](list : List[T])(f : T => Boolean): List[T] = list match {
case Nil => Nil
case (x::xs) => f(x) match {
case true => deleteIf(xs)(f)
case false => x :: deleteIf(xs)(f)
}
}
Itu adalah fungsi rekursif yang bekerja dari kepala daftar secara eksklusif, dan memanfaatkan pencocokan pola melalui :: extractor. Ini adalah sesuatu yang Anda lihat banyak dalam bahasa-bahasa seperti Haskell.
Jika Anda benar-benar ingin menambahkan cepat, Scala menyediakan banyak struktur data yang bisa berubah dan tidak dapat diubah untuk dipilih. Di sisi bisa berubah, Anda mungkin melihat ke dalam ListBuffer
. Atau, Vector
dari scala.collection.immutable
memiliki waktu penambahan cepat.