В документации +:
метода в ArraySeq
говорит, чтоПредварение к ArraySeq без копирования его
Копия последовательности с элементом в начале.
Есть ли способ добавить элемент без копирования всего ArraySeq
?
В документации +:
метода в ArraySeq
говорит, чтоПредварение к ArraySeq без копирования его
Копия последовательности с элементом в начале.
Есть ли способ добавить элемент без копирования всего ArraySeq
?
Несмотря на то, что ArraySeq является изменяемой коллекцией, некоторые методы-члены этой коллекции возвращают копию коллекции и не выполняют трансформацию «на месте». Из scala doc collections overview
Коллекция в пакете scala.collection.mutable известно, есть некоторые операции, которые меняют сбор на месте. Так что, имея дело с изменчивой коллекцией, вам нужно понять, какой код меняет , какая коллекция когда.
Таким образом, возможно, что изменчивые коллекции будут иметь некоторые методы, которые возвратят копии оригинальной коллекции.
С другой стороны, это гарантирует, что все операции над наборами в пакете scala.collection.immutable возвратят копии оригинальной коллекции.
Вы не можете. Цитирование из Collections Overview (жирного шрифта курсива):
массива последовательности являются изменяемыми последовательностями фиксированного размера, которые хранят свои элементы внутри в
Array[Object]
. Они реализованы в Scala по классуArraySeq
.
Превращение изменяет размер, эрго невозможно доложить до ArraySeq
.
Они очень похожи на Array
s, которые, конечно же, изменяемы и имеют фиксированный размер.
Если вы хотите изменить размер, вам нужен *Builder
или *Buffer
, в этом случае, в ArrayBuffer
, который делает есть метод +=:
для Предварения.
Вот как работает ArraySeq
. AFAIK есть нет другая встроенная опция.
Средства для регулировки размера он должен вернуть новый экземпляр :(
scala> val a = List(1)
a: List[Int] = List(1)
scala> val b = a :+ 2
b: List[Int] = List(1, 2)
scala> println(a)
List(1)
Дока говорит:
аннотация Защита + :(эль: A): ArraySeq [A ] [use case] Копия последовательности массивов с добавленным элементом.elem добавленный элемент возвращает новую коллекцию типа , состоящую из элева, за которой следуют все элементы этой последовательности массивов. Классы определения GenSeqLike
Аналогичная функция есть и в ArrayBuffer. Он также копирует, чтобы создать новый. Ниже приведены фрагменты кода для лучшего понимания ...
сниппет 1:
/** Prepends a single element to this buffer and returns
* the identity of the buffer. It takes time linear in
* the buffer size.
*
* @param elem the element to append.
* @return the updated buffer.
*/
def +=:(elem: A): this.type = {
ensureSize(size0 + 1)
copy(0, 1, size0)
array(0) = elem.asInstanceOf[AnyRef]
size0 += 1
this
}
Snippet2:
/** Inserts new elements at the index `n`. Opposed to method
* `update`, this method will not replace an element with a
* one. Instead, it will insert a new element at index `n`.
*
* @param n the index where a new element will be inserted.
* @param seq the traversable object providing all elements to insert.
* @throws Predef.IndexOutOfBoundsException if `n` is out of bounds.
*/
def insertAll(n: Int, seq: Traversable[A]) {
if (n < 0 || n > size0) throw new IndexOutOfBoundsException(n.toString)
val xs = seq.toList
val len = xs.length
ensureSize(size0 + len)
copy(n, n + len, size0 - n)
xs.copyToArray(array.asInstanceOf[scala.Array[Any]], n)
size0 += len
}
Я не думаю, что так. Вы можете использовать ArrayBuffer и т. Д. Для добавления append/prepend и т. Д. – Samar
@Samar Но это изменчиво, и мы действительно можем его мутировать ... Какой странный ... – stella
Ваш вопрос непонятен. Вы говорите о 'Seq' или' ArraySeq'? Вы упомянули обоим. Вы говорите о добавлении или добавлении? Вы говорите о предложении, но также упоминаете ': +', который добавляется. –