Скажи, что мне 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
Я знаю о преимуществах и недостатках List vs Array, и здесь меня по разным причинам особенно интересует расширение Array.
Редактировать 1
Спасибо за ответы, указывающие на :+
метод оператора. Это то, что я искал. К сожалению, это намного медленнее, чем использование специальной реализации метода append () arraycopy
- примерно в два-три раза медленнее. Глядя на реализацию в SeqLike[]
, создается построитель, затем к нему добавляется массив, затем выполняется добавление через построитель, затем построитель визуализируется. Плохая реализация для массивов. Я провел быстрый тест, сравнивая два метода, глядя на самое быстрое время из десяти циклов. Выполнение 10 миллионов повторений добавления одного элемента к экземпляру массива из 8 элементов некоторого класса Foo
занимает 3,1 секунды :+
и 1,7 секунды с помощью простого append()
метода, который используетSystem.arraycopy();
выполнение 10 миллионов повторений добавления одного элемента на 8-элементные массивы Long занимает 2,1 секунды :+
и 0,78 секунды при использовании простого append()
метода. Интересно, нельзя ли это исправить в библиотеке с помощью специальной реализации для Array
?
Редактировать 2
Чего стоит, билет я подал: https://issues.scala-lang.org/browse/SI-5017
ArrayBuffer
и его+=
метод? Это даст вам амортизированное добавление O (1).System.arraycopy(...)
заменено наArray.copy(...)
ArrayBuffer
который преобразуется после последнего добавления в массив (сtoArray
)?Ответы:
Вы можете использовать
:+
для добавления элемента в массив и+:
для его добавления :должен производить:
То же, что и с любой другой реализацией
Seq
.источник
Array.copy(repr, 0, result, 0, repr.length)
Также работает "реверс":
Также существует версия "на месте":
источник
Самым простым может быть:
Собственно, Array можно неявно преобразовать в
WrappedArray
источник