Подтвердить что ты не робот

Scala: какой способ добавить элемент в массив?

Скажем, у меня есть 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, и здесь я по разным причинам специально заинтересован в расширении массива.

Изменить 1

Спасибо за ответы, указывающие на метод оператора :+. Это то, что я искал. К сожалению, он медленнее, чем реализация специального метода append(), используя arraycopy - примерно в два-три раза медленнее. Глядя на реализацию в SeqLike[], создается строитель, затем массив добавляется к нему, затем добавление выполняется через построитель, затем создается визуализатор. Не очень хорошая реализация для массивов. Я сделал быстрый тест, сравнивающий два метода, глядя на самое быстрое время из десяти циклов. Выполнение 10 миллионов повторений одного элемента, добавляемого к экземпляру массива из 8 элементов какого-либо класса Foo, занимает 3,1 секунды с :+ и 1,7 с с помощью простого метода append(), который использует System.arraycopy(); item append повторения на 8-элементных массивах Long занимает 2,1 с с :+ и 0,78 с простым методом append(). Интересно, не удалось ли это исправлять в библиотеке с помощью специальной реализации для Array?

Изменить 2

Для чего это стоило, я подал билет: https://issues.scala-lang.org/browse/SI-5017

4b9b3361

Ответ 1

Вы можете использовать :+ для добавления элемента к массиву и +: для его добавления:

0 +: array :+ 4

должен производить:

res3: Array[Int] = Array(0, 1, 2, 3, 4)

Он аналогичен любой другой реализации Seq.

Ответ 2

val array2 = array :+ 4
//Array(1, 2, 3, 4)

Работает также "в обратном порядке":

val array2 = 4 +: array
Array(4, 1, 2, 3)

Существует также версия "на месте":

var array = Array( 1, 2, 3 )
array +:= 4
//Array(4, 1, 2, 3)
array :+= 0
//Array(4, 1, 2, 3, 0)

Ответ 3

Самый простой способ:

Array(1, 2, 3) :+ 4

Собственно, массив может быть трансформирован в WrappedArray