我想在我的程序中使用ArrayBuffer来保存数字列表。我想用它作为队列。每次删除列表中的第一项并使用它。然后我想知道每次删除第一个项目时,队列中的所有其他数字都会移动一个地方。我的意思是下次我可以再次阅读第(0)项吗?
答案 0 :(得分:3)
如果您查看Scala source code或ArrayBuffer,您会看到remove
的以下实现:
/** Removes the element on a given index position. It takes time linear in
* the buffer size.
*
* @param n the index which refers to the first element to delete.
* @param count the number of elements to delete
* @throws Predef.IndexOutOfBoundsException if `n` is out of bounds.
*/
override def remove(n: Int, count: Int) {
require(count >= 0, "removing negative number of elements")
if (n < 0 || n > size0 - count) throw new IndexOutOfBoundsException(n.toString)
copy(n + count, n, size0 - (n + count))
reduceToSize(size0 - count)
}
因此,删除的元素将不再存在于数组中,但实际上,删除意味着复制所有元素(&#34;在您的定义中移位&#34;),对于更长的数组,它将会很慢。
答案 1 :(得分:2)
ArrayBuffer
基本上是一个实现Buffer
所有方便方法的数组。
它按您描述的方式工作:如果删除一个元素,所有剩余的元素都会转移到“填补空白”,并且如文档中所述,特别是如果删除第一个元素可能需要一些时间:
追加,更新和随机访问需要恒定时间(摊销时间)。 Prepends和remove在缓冲区大小上是线性的。
因此我不建议使用ArrayBuffer
作为队列。
实际上,最好的选择是您的问题:只需使用Queue
。它的设计是......好吧......一个队列!
答案 2 :(得分:2)
答案 3 :(得分:0)
如果要使用数组支持的数据结构(例如,对于运行时(缓存局部性)或存储(没有下一个指针)效率原因),您可能需要考虑java.util.ArrayDeque
。此类有效地实现了一个圆形数组,该数组在满时调整大小。 poll()
(检索和删除第一个元素)方法只需增加起始偏移量
缺点是,即使此类实现了java.util.Queue
接口,也没有隐式转换为scala.collection.mutable.Queue
,因此您无法使用Scala集合方法,例如{{1等等。
注意:从2.11开始,Scala没有map
接口,只留下Deque
实现。