您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Scala語言中Array類的作用是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
Array類 通用數組類定義如下。 final class Array[A](len: Int) extends Seq[A] { def length: Int = len def apply(i: Int): A = ... def update(i: Int, x: A): Unit = ... def elements: Iterator[A] = ... def subArray(from: Int, end: Int): Array[A] = ... def filter(p: A => Boolean): Array[A] = ... def map[B](f: A => B): Array[B] = ... def flatMap[B](f: A => Array[B]): Array[B] = ... } 如果T不是類型參數或抽象類型,類型Array[T]表示宿主系統中的原生數組類型[]T。這種情況下length返回數組的長度,apply表示下標,update表示元素更新。由于apply和update操作(§6.25)的語法糖的存在,以下是Scala和Java/C#中對數組xs操作的對應: Scala Java/C# xs.length xs.length xs(i) xs[i] xs(i) = e xs[i] = e 標準引用類 數組也實現了序列特征scala.Seq,定義了elements方法來返回一個包含數組中所有元素的Iterator 因為在Scala中參數化類型的數組和宿主語言中數組的實現還是有差異的,在處理數組時需要注意一些細小的差別。解釋如下。 首先,不像Java或C#中的數組,Scala中的數組不是協變的;也就是說,在Scala中S<:T并不能得出Array[S] <: Array[T]。但是如果在宿主環境中可以將S變為T則可以將S的數組變為T的數組。 舉例來說Array[String]并不與Array[Object]一致,即使String與Object一致。然而可以將類型為Array[String]的表達式變為Array[Object]。該轉變將會成功,不會拋出ClassCastException。例子如下: val xs = new Array[String](2) // val ys: Array[Object] = xs // **** 錯誤:不兼容的類型 val ys: Array[Object] = xs.asInstanceOf[Array[Object]] //OK 其次,對于有一個類型參數或抽象類型T作為元素類型的多態數組,其表現形式不同于[]T。然而isInstanceOf和asInstanceOf仍像數組數組使用單態數組的標準表現形式那樣正常工作。 val ss = new Array[String](2) def f[T](xs: Array[T]): Array[String] = if(xs.isInstanceOf[Array[String]]) xs.asInstanceOf[Array[String]] else throw new Error(“not an instance”) f(ss) // 返回ss 多態數組的表現形式同樣保證了多態數組的創建與期望一致。以下是一個mkArray方法的例子,給定定義了元素且類型為T的序列創建任意類型T的數組。 def mkArray[T](elems: Seq[T]): Array[T] = { val result = new Array[T](elems.length) val I = 0 for (elem <- elems) { result(i) = elem I += 1 } } 注意在Java數組的類型擦除模型下,以上方法不能按照期望的方式工作-實際上它將總是返回一個Object數組。 再次,在Java環境中有一個方法System.arraycopy,有兩個對象為參數,指定起始坐標和長度,將元素從一個對象復制到另外一個對象,這兩個對象的元素類型必須是兼容的。對于Scala的多態數組該方法不能正常工作,因為他們有不同的表現形式。作為代替應當使用Array類的伴隨對象Array.copy方法。該伴隨對象也定義了不同的數組構造方法,還定義了提取方法unapplySeq(§8.1.7),提供了數組上的模式匹配。 package scala Scala 標準庫 object Array { /** 從?src?復制元素到?dest? */ def copy(src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int): Unit = ... /** 將參數中所有數組合并為一個 */ def concat[T](xs: Array[T]*): Array[T] = ... /** 創建一個連續的整數數組 */ def range(start: Int, end: Int): Array[Int] = ... /** 用給定元素創建一個數組 */ def apply[A <: AnyRef](xs: A*): Array[A] = ... /** 與上面類似 */ def apply(xs: Boolean*) : Array[Boolean] = ... def apply(xs: Byte*) : Array[Byte] = ... def apply(xs: Short*) : Array[Short] = ... def apply(xs: Char*) : Array[Char] = ... def apply(xs: Int*) : Array[Int] = ... def apply(xs: Long*) : Array[Long] = ... def apply(xs: Float*) : Array[Float] = ... def apply(xs: Double*) : Array[Double] = ... def apply(xs: Unit*) : Array[Unit] = ... /** 創建一個數組,包含一個元素的多個拷貝 */ def make[A](n: Int, elem: A): Array[A] = ... /** 提供數組上的模式匹配 */ def unapplySeq[A](x: Array[A]): Option[Seq[A]] = Some(x) } 示例12.3.1 以下方法復制給定的數組參量并返回初始數組和復制的數組: def duplicate[T](xs: Array[T]) = { val ys = new Array[T](xs.length) Array.copy(xs, 0, ys, 0, xs.length) (xs, ys) } |
關于Scala語言中Array類的作用是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。