Katakanlah saya punya Array[Int]
suka
val array = Array( 1, 2, 3 )
Sekarang saya ingin menambahkan elemen ke array, katakan nilainya 4
, seperti pada contoh berikut:
val array2 = array + 4 // will not compile
Saya tentu saja dapat menggunakan System.arraycopy()
dan melakukan ini sendiri, tetapi harus ada fungsi pustaka Scala untuk ini, yang tidak dapat saya temukan. Terima kasih atas petunjuknya!
Catatan:
Saya sadar bahwa saya dapat menambahkan Array elemen lain, seperti di baris berikut, tetapi itu tampak terlalu membulat:
val array2b = array ++ Array( 4 ) // this works
Saya menyadari kelebihan dan kekurangan List vs Array dan di sinilah saya karena berbagai alasan yang secara khusus tertarik untuk memperluas Array.
Edit 1
Terima kasih atas jawaban yang menunjuk ke :+
metode operator. Inilah yang saya cari. Sayangnya, ini agak lebih lambat daripada implementasi metode append () khusus yang menggunakan arraycopy
- sekitar dua hingga tiga kali lebih lambat. Melihat implementasinya SeqLike[]
, builder dibuat, lalu array ditambahkan ke dalamnya, lalu append dilakukan melalui builder, lalu builder dirender. Bukan implementasi yang baik untuk array. Saya melakukan patokan cepat dengan membandingkan kedua metode tersebut, melihat waktu tercepat dari sepuluh siklus. Melakukan 10 juta pengulangan item tunggal yang ditambahkan ke instance array 8-elemen dari beberapa kelas Foo
membutuhkan waktu 3,1 detik dengan :+
dan 1,7 detik dengan append()
metode sederhana yang menggunakanSystem.arraycopy();
melakukan 10 juta pengulangan item tunggal pada array 8 elemen Long membutuhkan waktu 2,1 detik dengan :+
dan 0,78 detik dengan append()
metode sederhana . Bertanya-tanya apakah ini tidak dapat diperbaiki di perpustakaan dengan penerapan khusus untuk Array
?
Edit 2
Untuk apa nilainya, saya mengajukan tiket: https://issues.scala-lang.org/browse/SI-5017
ArrayBuffer
dan+=
metodenya? Itu akan memberi Anda amortisasi O (1) tambahkan.System.arraycopy(...)
digantikan olehArray.copy(...)
ArrayBuffer
yang diubah setelah penambahan terakhir ke sebuah array (withtoArray
)?Jawaban:
Anda dapat menggunakan
:+
untuk menambahkan elemen ke larik dan+:
untuk menambahkannya:harus menghasilkan:
Ini sama dengan implementasi lainnya
Seq
.sumber
Array.copy(repr, 0, result, 0, repr.length)
Bekerja juga "terbalik":
Ada juga versi "di tempat":
sumber
Mungkin yang termudah:
Sebenarnya, Array secara implisit dapat diubah menjadi
WrappedArray
sumber