arraybuffer.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 189 行
SCALA
189 行
/* __ *\** ________ ___ / / ___ Scala API **** / __/ __// _ | / / / _ | (c) 2003-2007, LAMP/EPFL **** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **** /____/\___/_/ |_/____/_/ | | **** |/ **\* */// $Id: ArrayBuffer.scala 14378 2008-03-13 11:39:05Z dragos $package scala.collection.mutableimport Predef._/** An implementation of the <code>Buffer</code> class using an array to * represent the assembled sequence internally. Append, update and random * access take constant time (amortized time). Prepends and removes are * linear in the buffer size. * * @author Matthias Zenger * @version 1.0, 15/03/2004 */@serializableclass ArrayBuffer[A] extends RandomAccessSeq.Mutable[A] with Buffer[A] with ResizableArray[A] { /** Appends a single element to this buffer and returns * the identity of the buffer. It takes constant time. * * @param elem the element to append. */ def +=(elem: A) { ensureSize(size0 + 1) array(size0) = elem size0 += 1 } /** Appends a number of elements provided by an iterable object * via its <code>elements</code> method. The identity of the * buffer is returned. * * @param iter the iterable object. * @return the updated buffer. */ override def ++=(iter: Iterable[A]) { iter copyToBuffer this } override def ++[B >: A](that: Iterable[B]) : ArrayBuffer[B] = { val buf = new ArrayBuffer[B] this copyToBuffer buf that copyToBuffer buf buf } /** Appends a number of elements in an array * * @param src the array * @param start the first element to append * @param len the number of elements to append */ override def ++=(src: Array[A], start: Int, len: Int) { ensureSize(size0 + len) Array.copy(src, start, array, size0, len) size0 += len } /** Prepends a single element to this buffer and return * 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): Buffer[A] = { ensureSize(size0 + 1) copy(0, 1, size0) array(0) = elem size0 += 1 this } /** Returns the i-th element of this ArrayBuffer. It takes constant time. * * @param i the specified index. * @return the i-th element. * @throws Predef.IndexOutOfBoundException if <code>i</code> is out of bounds. */ override def apply(i: Int) = { if ((i < 0) || (i >= size0)) throw new IndexOutOfBoundsException(i.toString()) else array(i) } /** Prepends a number of elements provided by an iterable object * via its <code>elements</code> method. The identity of the * buffer is returned. * * @param iter the iterable object. * @return the updated buffer. */ override def ++:(iter: Iterable[A]): Buffer[A] = { insertAll(0, iter); this } /** Inserts new elements at the index <code>n</code>. Opposed to method * <code>update</code>, this method will not replace an element with a * one. Instead, it will insert a new element at index <code>n</code>. * * @param n the index where a new element will be inserted. * @param iter the iterable object providing all elements to insert. * @throws Predef.IndexOutOfBoundsException if <code>n</code> is out of bounds. */ def insertAll(n: Int, iter: Iterable[A]) { if ((n < 0) || (n > size0)) throw new IndexOutOfBoundsException("cannot insert element at " + n); val xs = iter.elements.toList val len = xs.length ensureSize(size0 + len) copy(n, n + len, size0 - n) xs.copyToArray(array, n) size0 += len } /** Replace element at index <code>n</code> with the new element * <code>newelem</code>. It takes constant time. * * @param n the index of the element to replace. * @param newelem the new element. * @throws Predef.IndexOutOfBoundsException if <code>n</code> is out of bounds. */ def update(n: Int, newelem: A) { if ((n < 0) || (n >= size0)) throw new IndexOutOfBoundsException("cannot update element at " + n) else { val res = array(n) array(n) = newelem res } } /** Removes the element on a given index position. It takes time linear in * the buffer size. * * @param n the index which refers to the element to delete. * @return the updated array buffer. * @throws Predef.IndexOutOfBoundsException if <code>n</code> is out of bounds. */ def remove(n: Int): A = { if ((n < 0) || (n >= size0)) throw new IndexOutOfBoundsException("cannot remove element at " + n); val res = array(n) copy(n + 1, n, size0 - n - 1) size0 -= 1 res } /** Clears the buffer contents. */ def clear() { size0 = 0 } /** Return a clone of this buffer. * * @return an <code>ArrayBuffer</code> with the same elements. */ override def clone(): Buffer[A] = { val res = new ArrayBuffer[A] res ++= this res } /** Checks if two buffers are structurally identical. * * @return true, iff both buffers contain the same sequence of elements. */ override def equals(obj: Any): Boolean = obj match { case that: ArrayBuffer[_] => this.length == that.length && elements.zip(that.elements).forall { case (thiselem, thatelem) => thiselem == thatelem } case _ => false } /** Defines the prefix of the string representation. */ override protected def stringPrefix: String = "ArrayBuffer"}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?