2016-09-03 8 views
1

В документации +: метода в ArraySeq говорит, чтоПредварение к ArraySeq без копирования его

Копия последовательности с элементом в начале.

Есть ли способ добавить элемент без копирования всего ArraySeq?

+0

Я не думаю, что так. Вы можете использовать ArrayBuffer и т. Д. Для добавления append/prepend и т. Д. – Samar

+0

@Samar Но это изменчиво, и мы действительно можем его мутировать ... Какой странный ... – stella

+0

Ваш вопрос непонятен. Вы говорите о 'Seq' или' ArraySeq'? Вы упомянули обоим. Вы говорите о добавлении или добавлении? Вы говорите о предложении, но также упоминаете ': +', который добавляется. –

ответ

1

Несмотря на то, что ArraySeq является изменяемой коллекцией, некоторые методы-члены этой коллекции возвращают копию коллекции и не выполняют трансформацию «на месте». Из scala doc collections overview

Коллекция в пакете scala.collection.mutable известно, есть некоторые операции, которые меняют сбор на месте. Так что, имея дело с изменчивой коллекцией, вам нужно понять, какой код меняет , какая коллекция когда.

Таким образом, возможно, что изменчивые коллекции будут иметь некоторые методы, которые возвратят копии оригинальной коллекции.

С другой стороны, это гарантирует, что все операции над наборами в пакете scala.collection.immutable возвратят копии оригинальной коллекции.

1

Вы не можете. Цитирование из Collections Overview (жирного шрифта курсива):

массива последовательности являются изменяемыми последовательностями фиксированного размера, которые хранят свои элементы внутри в Array[Object]. Они реализованы в Scala по классу ArraySeq.

Превращение изменяет размер, эрго невозможно доложить до ArraySeq.

Они очень похожи на Array s, которые, конечно же, изменяемы и имеют фиксированный размер.

Если вы хотите изменить размер, вам нужен *Builder или *Buffer, в этом случае, в ArrayBuffer, который делает есть метод +=: для Предварения.

2

Вот как работает 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 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^