Скажи, что мне 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
System.arraycopy(...)заменено наArray.copy(...)
ArrayBufferкоторый преобразуется после последнего добавления в массив (с toArray)?
ArrayBufferи его+=метод? Это даст вам амортизированное добавление O (1).