预先安装ArraySeq而不复制它

时间:2016-09-03 11:46:14

标签: scala seq

+:ArraySeq方法的文档中说

  

带有前置元素的序列的副本。

有没有办法在不复制整个ArraySeq的情况下添加元素?

3 个答案:

答案 0 :(得分: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)

Doc说:

  

抽象def   + :( elem:A):ArraySeq [A] [用例]数组序列的副本,前面有一个元素。 elem前置元素返回一个新元素   类型的集合由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
  }

答案 1 :(得分:1)

尽管ArraySeq是一个可变集合,但此集合的某些成员方法将返回该集合的副本,而不是&#34;就位#34;转型。来自scala doc collections overview

  

包scala.collection.mutable中的集合已知有一些   更改集合的操作。所以处理   可变集合意味着您需要了解哪些代码更改   哪个集合何时。

因此,可变集合可能会有一些方法可以返回原始集合的副本。

另一方面,它保证scala.collection.immutable包中集合上的所有操作都将返回原始集合的副本。

答案 2 :(得分:1)

你做不到。引自Collections Overview粗体强调我的):

  

数组序列是固定大小的可变序列,它们将元素内部存储在Array[Object]中。它们由类ArraySeq在Scala中实现。

预先更改大小,因此无法预先添加ArraySeq

它们与Array非常相似,它们当然也是可变的并且具有固定的大小。

如果您想更改尺寸,则需要*Builder*Buffer,在这种情况下需要ArrayBuffer,其中 有{ {3}}前置方法。