boxedarray.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 187 行

SCALA
187
字号
/*                     __                                               *\**     ________ ___   / /  ___     Scala API                            ****    / __/ __// _ | / /  / _ |    (c) 2002-2008, LAMP/EPFL             ****  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **** /____/\___/_/ |_/____/_/ | |                                         ****                          |/                                          **\*                                                                      */// $Id: BoxedArray.scala 14347 2008-03-10 12:00:03Z odersky $package scala.runtimeimport Predef._import collection.mutable.ArrayBuffer/** *  <p>A class representing <code>Array[T]</code></p> * *  @author  Martin Odersky, Stephane Micheloud *  @version 1.0 */abstract class BoxedArray extends Array.Array0[Any] {  /** The length of the array */  def length: Int  /** The element at given index */  def apply(index: Int): Any  /** Update element at given index */  def update(index: Int, elem: Any): Unit  /** Convert to Java array.   *  @param elemTag    Either one of the tags ".N" where N is the name of a primitive type   *                    (@see ScalaRunTime), or a full class name.   */  //todo: remove  def unbox(elemTag: String): AnyRef  def unbox(elemClass: Class[_]): AnyRef  override def isDefinedAt(x: Int): Boolean = 0 <= x && x < length  override def elements = new Iterator[Any] {    var index = 0    def hasNext: Boolean = index < length    def next(): Any = { val i = index; index = i + 1; apply(i) }  }  /** The underlying array value   */  def value: AnyRef  def copyFrom(src: AnyRef, from: Int, to: Int, len: Int): Unit =     Array.copy(src, from, value, to, len)  def copyTo(from: Int, dest: AnyRef, to: Int, len: Int): Unit = {    Array.copy(value, from, dest, to, len)  }  /** Fills the given array <code>xs</code> with the elements of   *  this sequence starting at position <code>start</code>.   *   *  @param  xs the array to fill.   *  @param  start starting index.   *  @pre    the array must be large enough to hold all elements.   */  override def copyToArray[B](xs: Array[B], start: Int): Unit =    copyTo(0, xs, start, length)  // todo: add a copyToBuffer  // todo: eliminate  def subArray(from: Int, end: Int): AnyRef  final override def map[b](f: Any => b): Array[b] = {    val len = length    val result = new Array[b](len)    var i = 0    while (i < len) {      result(i) = f(apply(i))      i += 1    }    result  }  final override def flatMap[b](f: Any => Iterable[b]): Array[b] = {    val buf = new ArrayBuffer[b]    val len = length    var i = 0    while (i < len) {      buf ++= f(apply(i))      i += 1    }    buf.toArray  }    final override def ++[b >: Any](that: Iterable[b]): Array[b] = super.++(that).toArray  final def zip[b](that: Array[b]): Array[(Any,b)] = {    val len = this.length min that.length    val result = new Array[(Any,b)](len)    var i = 0    while (i < len) {      result(i) = (this(i), that(i))      i += 1    }    result  }    final def zipWithIndex: Array[(Any,Int)] = {    val len = length    val result = new Array[(Any,Int)](len)    var i = 0    while (i < len) {      result(i) = (this(i), i)      i += 1    }    result  }  /** Returns an array that contains all indices of this array */  def indices: Array[Int] = Array.range(0, length)  final def deepToString() = deepMkString(stringPrefix + "(", ",", ")")  final def deepMkString(start: String, sep: String, end: String): String = {    def _deepToString(x: Any) = x match {      case a: AnyRef if ScalaRunTime.isArray(a) =>        ScalaRunTime.boxArray(a).deepMkString(start, sep, end)      case _ =>        x.toString    }    val buf = new StringBuilder()    buf.append(start)    val elems = elements    if (elems.hasNext) buf.append(_deepToString(elems.next))    while (elems.hasNext) {      buf.append(sep); buf.append(_deepToString(elems.next))    }    buf.append(end)    buf.toString  }  final def deepMkString(sep: String): String = this.deepMkString("", sep, "")  final def deepEquals(that: Any): Boolean = {    def _deepEquals(x1: Any, x2: Any) = (x1, x2) match {      case (a1: BoxedArray, a2: BoxedArray) =>        _sameElements(a1, a2)      case (a1: AnyRef, a2: AnyRef)           if ScalaRunTime.isArray(a1) && ScalaRunTime.isArray(a2) =>        _sameElements(ScalaRunTime.boxArray(a1), ScalaRunTime.boxArray(a2))      case _ =>        x1.equals(x2)    }    def _sameElements(a1: BoxedArray, a2: BoxedArray): Boolean = {      val it1 = a1.elements      val it2 = a2.elements      var res = true      while (res && it1.hasNext && it2.hasNext)        res = _deepEquals(it1.next, it2.next)      !it1.hasNext && !it2.hasNext && res    }    that match {      case a: BoxedArray =>        _sameElements(this, a)      case a: AnyRef if ScalaRunTime.isArray(a) =>        _sameElements(this, ScalaRunTime.boxArray(a))      case _ =>        false    }  }  override final def stringPrefix: String = "Array"      protected def newArray(length : Int, elements : Iterator[Any]) : BoxedArray  override def projection : scala.Array.Projection[Any] = new scala.Array.Projection[Any] {    def update(idx : Int, what : Any) : Unit = BoxedArray.this.update(idx, what)    def length = BoxedArray.this.length    def apply(idx : Int) = BoxedArray.this.apply(idx)    override def stringPrefix = "ArrayP"    protected def newArray[B >: Any](length : Int, elements : Iterator[Any]) =       BoxedArray.this.newArray(length, elements).asInstanceOf[Array[B]]  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?