Seq trait用于表示序列。所謂序列,指的是一類(lèi)具有一定長(cháng)度的可迭代訪(fǎng)問(wèn)的對象,其中每個(gè)元素均帶有一個(gè)從0開(kāi)始計數的固定索引位置。
序列的操作有以下幾種,如下表所示:
如果一個(gè)序列是可變的,它提供了另一種更新序列中的元素的,但有副作用的update方法,Scala中常有這樣的語(yǔ)法,如seq(idx) = elem。它只是seq.update(idx, elem)的簡(jiǎn)寫(xiě),所以update 提供了方便的賦值語(yǔ)法。應注意update 和updated之間的差異。update 再原來(lái)基礎上更改序列中的元素,并且僅適用于可變序列。而updated 適用于所有的序列,它總是返回一個(gè)新序列,而不會(huì )修改原序列。
| WHAT IT IS | WHAT IT DOES |
|---|---|
| 索引和長(cháng)度 | |
| xs(i) | (或者寫(xiě)作xs apply i)。xs的第i個(gè)元素 |
| xs isDefinedAt i | 測試xs.indices中是否包含i。 |
| xs.length | 序列的長(cháng)度(同size)。 |
| xs.lengthCompare ys | 如果xs的長(cháng)度小于ys的長(cháng)度,則返回-1。如果xs的長(cháng)度大于ys的長(cháng)度,則返回+1,如果它們長(cháng)度相等,則返回0。即使其中一個(gè)序列是無(wú)限的,也可以使用此方法。 |
| xs.indices | xs的索引范圍,從0到xs.length - 1。 |
| 索引搜索 | |
| xs indexOf x | 返回序列xs中等于x的第一個(gè)元素的索引(存在多種變體)。 |
| xs lastIndexOf x | 返回序列xs中等于x的最后一個(gè)元素的索引(存在多種變體)。 |
| xs indexOfSlice ys | 查找子序列ys,返回xs中匹配的第一個(gè)索引。 |
| xs indexOfSlice ys | 查找子序列ys,返回xs中匹配的倒數一個(gè)索引。 |
| xs indexWhere p | xs序列中滿(mǎn)足p的第一個(gè)元素。(有多種形式) |
| xs segmentLength (p, i) | xs中,從xs(i)開(kāi)始并滿(mǎn)足條件p的元素的最長(cháng)連續片段的長(cháng)度。 |
| xs prefixLength p | xs序列中滿(mǎn)足p條件的先頭元素的最大個(gè)數。 |
| 加法: | |
| x +: xs | 由序列xs的前方添加x所得的新序列。 |
| xs :+ x | 由序列xs的后方追加x所得的新序列。 |
| xs padTo (len, x) | 在xs后方追加x,直到長(cháng)度達到len后得到的序列。 |
| 更新 | |
| xs patch (i, ys, r) | 將xs中第i個(gè)元素開(kāi)始的r個(gè)元素,替換為ys所得的序列。 |
| xs updated (i, x) | 將xs中第i個(gè)元素替換為x后所得的xs的副本。 |
| xs(i) = x | (或寫(xiě)作 xs.update(i, x),僅適用于可變序列)將xs序列中第i個(gè)元素修改為x。 |
| 排序 | |
| xs.sorted | 通過(guò)使用xs中元素類(lèi)型的標準順序,將xs元素進(jìn)行排序后得到的新序列。 |
| xs sortWith lt | 將lt作為比較操作,并以此將xs中的元素進(jìn)行排序后得到的新序列。 |
| xs sortBy f | 將序列xs的元素進(jìn)行排序后得到的新序列。參與比較的兩個(gè)元素各自經(jīng)f函數映射后得到一個(gè)結果,通過(guò)比較它們的結果來(lái)進(jìn)行排序。 |
| 反轉 | |
| xs.reverse | 與xs序列元素順序相反的一個(gè)新序列。 |
| xs.reverseIterator | 產(chǎn)生序列xs中元素的反序迭代器。 |
| xs reverseMap f | 以xs的相反順序,通過(guò)f映射xs序列中的元素得到的新序列。 |
| 比較 | |
| xs startsWith ys | 測試序列xs是否以序列ys開(kāi)頭(存在多種形式)。 |
| xs endsWith ys | 測試序列xs是否以序列ys結束(存在多種形式)。 |
| xs contains x | 測試xs序列中是否存在一個(gè)與x相等的元素。 |
| xs containsSlice ys | 測試xs序列中是否存在一個(gè)與ys相同的連續子序列。 |
| (xs corresponds ys)(p) | 測試序列xs與序列ys中對應的元素是否滿(mǎn)足二元的判斷式p。 |
| 多集操作 | |
| xs intersect ys | 序列xs和ys的交集,并保留序列xs中的順序。 |
| xs diff ys | 序列xs和ys的差集,并保留序列xs中的順序。 |
| xs union ys | 并集;同xs ++ ys。 |
| xs.distinct | 不含重復元素的xs的子序列。 |
特性(trait) Seq 具有兩個(gè)子特征(subtrait) LinearSeq和IndexedSeq。它們不添加任何新的操作,但都提供不同的性能特點(diǎn):線(xiàn)性序列具有高效的 head 和 tail 操作,而索引序列具有高效的apply, length, 和 (如果可變) update操作。
常用線(xiàn)性序列有 scala.collection.immutable.List和scala.collection.immutable.Stream。常用索引序列有 scala.Array scala.collection.mutable.ArrayBuffer。Vector 類(lèi)提供一個(gè)在索引訪(fǎng)問(wèn)和線(xiàn)性訪(fǎng)問(wèn)之間有趣的折中。它同時(shí)具有高效的恒定時(shí)間的索引開(kāi)銷(xiāo),和恒定時(shí)間的線(xiàn)性訪(fǎng)問(wèn)開(kāi)銷(xiāo)。正因為如此,對于混合訪(fǎng)問(wèn)模式,vector是一個(gè)很好的基礎。后面將詳細介紹vector。
Buffers是可變序列一個(gè)重要的種類(lèi)。它們不僅允許更新現有的元素,而且允許元素的插入、移除和在buffer尾部高效地添加新元素。buffer 支持的主要新方法有:用于在尾部添加元素的 += 和 ++=;用于在前方添加元素的+=: 和 ++=: ;用于插入元素的 insert和insertAll;以及用于刪除元素的remove 和 -=。如下表所示。
ListBuffer和ArrayBuffer是常用的buffer實(shí)現 。顧名思義,ListBuffer依賴(lài)列表(List),支持高效地將它的元素轉換成列表。而ArrayBuffer依賴(lài)數組(Array),能快速地轉換成數組。
| WHAT IT IS | WHAT IT DOES |
|---|---|
| 加法: | |
| buf += x | 將元素x追加到buffer,并將buf自身作為結果返回。 |
| buf += (x, y, z) | 將給定的元素追加到buffer。 |
| buf ++= xs | 將xs中的所有元素追加到buffer。 |
| x +=: buf | 將元素x添加到buffer的前方。 |
| xs ++=: buf | 將xs中的所有元素都添加到buffer的前方。 |
| buf insert (i, x) | 將元素x插入到buffer中索引為i的位置。 |
| buf insertAll (i, xs) | 將xs的所有元素都插入到buffer中索引為i的位置。 |
| 移除: | |
| buf -= x | 將元素x從buffer中移除。 |
| buf remove i | 將buffer中索引為i的元素移除。 |
| buf remove (i, n) | 將buffer中從索引i開(kāi)始的n個(gè)元素移除。 |
| buf trimStart n | 移除buffer中的前n個(gè)元素。 |
| buf trimEnd n | 移除buffer中的后n個(gè)元素。 |
| buf.clear() | 移除buffer中的所有元素。 |
| 克?。?/span> | |
| buf.clone | 與buf具有相同元素的新buffer。 |
聯(lián)系客服