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();
выполнение 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