Scala: каков наилучший способ добавления элемента в массив?

скажем, у меня есть Array[Int] как

val array = Array( 1, 2, 3 )

теперь я хотел бы добавить элемент в массив, скажем, стоимостью 4, как в следующем примере:

val array2 = array + 4     // will not compile

я конечно могу использовать System.arraycopy() и сделать это самостоятельно, но для этого должна быть функция библиотеки Scala, которую я просто не мог найти. Спасибо за любые указатели!

Примечания:

  1. я знаю, что я могу добавить другой массив элементов, как в следующая строка, но это кажется слишком круглым:

    val array2b = array ++ Array( 4 )     // this works
    
  2. я знаю о преимуществах и недостатках List vs Array, и здесь я по разным причинам особенно заинтересован в расширении массива.

изменить 1

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

Изменить 2

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

3 ответов


можно использовать :+ добавить элемент в массив и +:, чтобы добавить это:

0 +: array :+ 4

следует производить:

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

это то же самое, что и с любой другой реализацией Seq.


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)

самый простой может быть:

Array(1, 2, 3) :+ 4

на самом деле, массив может быть implcitly превращается в WrappedArray