+:
中ArraySeq
方法的文档中说
带有前置元素的序列的副本。
有没有办法在不复制整个ArraySeq
的情况下添加元素?
答案 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}}前置方法。