Скажіть, мені Array[Int]
подобається
val array = Array( 1, 2, 3 )
Тепер я хотів би додати елемент до масиву, сказати значення 4
, як у наступному прикладі:
val array2 = array + 4 // will not compile
Я, звичайно, можу скористатися System.arraycopy()
і робити це самостійно, але для цього повинна бути функція бібліотеки Scala, яку я просто не міг знайти. Дякуємо за будь-які покажчики!
Примітки:
Я усвідомлюю, що можу додати ще один масив елементів, як у наступному рядку, але це здається занадто круглим:
val array2b = array ++ Array( 4 ) // this works
Мені відомо про переваги та недоліки списку проти масиву, і ось я з різних причин конкретно зацікавлений у розширенні масиву.
Редагуйте 1
Дякуємо за відповіді, що вказують на :+
метод оператора. Це те, що я шукав. На жаль, це набагато повільніше, ніж використання методу користувальницької додавання (), використовуючи arraycopy
- приблизно в два-три рази повільніше. Дивлячись на реалізацію в SeqLike[]
, створюється builder, потім до нього додається масив, потім додавання робиться через builder, потім надається builder. Недобра реалізація для масивів. Я зробив швидкий показник порівняння двох методів, дивлячись на найшвидший час з десяти циклів. Здійснення 10 мільйонів повторів одного елемента, доданих до 8-елементного екземпляра масиву деякого класу, Foo
займає 3,1 секунди :+
та 1,7 секунди простим append()
методом, який використовуєSystem.arraycopy();
роблячи повторення додавання 10 мільйонів одноелементів на 8-елементних масивах Long, що займає 2,1 секунди, :+
а прості - 0,78 сек.append()
метод. Цікаво, що це не вдалося виправити в бібліотеці із спеціальною реалізацією дляArray
?
Редагуйте 2
На що це варто, я подав квиток: https://isissue.scala-lang.org/browse/SI-5017
System.arraycopy(...)
замінюєтьсяArray.copy(...)
ArrayBuffer
перетворений після останнього додавання до масиву (з toArray
)?
ArrayBuffer
і його+=
метод? Це дасть вам амортизований додаток O (1).