Скала: что является лучшим способом, чтобы добавить элемент в массив?


скажем, у меня есть 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-элементных массивах Long занимает 2,1 сек с :+ и 0,78 сек с простым append() метод. Интересно, если это не может быть исправлено в библиотеке с пользовательской реализацией для Array?

Edit 2

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

3 84

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

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