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