Scala: как лучше всего добавить элемент в массив? - PullRequest
103 голосов
/ 21 сентября 2011

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

176 голосов
/ 21 сентября 2011

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

0 +: array :+ 4

должно выдать:

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

Это так же, как и для любого другогореализация Seq.

51 голосов
/ 21 сентября 2011
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)
7 голосов
/ 21 сентября 2011

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

Array(1, 2, 3) :+ 4

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

...