Scala迭代器
迭代器不是集合,而是一種由一個訪問的集合之一的元素。在一個迭代的兩種基本操作:next和hasNext。調用 it.next()將返回迭代器的下一個元素,推進迭代器的狀態。可以找出是否有更多的元素使用迭代器的it.hasNext方法返回。
最簡單的方法是使用while循環“單步”將迭代器返回所有的元素。來看一個真實的例子:
object Test { def main(args: Array[String]) { val it = Iterator("a", "number", "of", "words") while (it.hasNext){ println(it.next()) } } }
當上述代碼被編譯和執行時,它產生了以下結果:
C:/>scalac Test.scala C:/>scala Test a number of words C:/>
查找最小和最大值的元素:
可以使用 it.min 和 it.max 方法在一個迭代中找出最小和最大值元素。下麵是使用示例:
object Test { def main(args: Array[String]) { val ita = Iterator(20,40,2,50,69, 90) val itb = Iterator(20,40,2,50,69, 90) println("Maximum valued element " + ita.max ) println("Minimum valued element " + itb.min ) } }
這裡,我們用ita和itb執行兩個不同的操作,因為迭代可以被通過一次。當上述代碼被編譯和執行時,它產生了以下結果:
C:/>scalac Test.scala C:/>scala Test Maximum valued element 90 Minimum valued element 2 C:/>
找出迭代器的長度:
可以使用以下任一方法:it.size 或 it.length 找出在一個迭代可用元素的數目。下麵是使用:
object Test { def main(args: Array[String]) { val ita = Iterator(20,40,2,50,69, 90) val itb = Iterator(20,40,2,50,69, 90) println("Value of ita.size : " + ita.size ) println("Value of itb.length : " + itb.length ) } }
這裡,我們用ita和itb執行兩個不同的操作,因為迭代可以被通過一次。當上述代碼被編譯和執行時,它產生了以下結果:
C:/>scalac Test.scala C:/>scala Test Value of ita.size : 6 Value of itb.length : 6 C:/>
Scala迭代器方法:
以下是可以使用迭代器的一些重要方法。有關可用方法的完整列表,請Scala的的官方文檔。
SN | 方法及描述 |
---|---|
1 |
def hasNext: Boolean 測試此迭代器是否能提供另一個元素。 |
2 |
def next(): A 產生這個迭代的下一個元素。 |
3 |
def ++(that: => Iterator[A]): Iterator[A] 此迭代器與另一個連接。 |
4 |
def ++[B >: A](that :=> GenTraversableOnce[B]): Iterator[B] 此迭代器與另一個連接。 |
5 |
def addString(b: StringBuilder): StringBuilder 返回字符串生成器b到元素被追加。 |
6 |
def addString(b: StringBuilder, sep: String): StringBuilder 返回字符串生成器b到元素被追加使用分隔字符串。 |
7 |
def buffered: BufferedIterator[A] 從緩衝迭代器創建此迭代器。 |
8 |
def contains(elem: Any): Boolean 測試此迭代器是否包含給定值作為一個元素。 |
9 |
def copyToArray(xs: Array[A], start: Int, len: Int): Unit 將選定這個迭代器數組產生的值。 |
10 |
def count(p: (A) => Boolean): Int 計算在遍曆或迭代滿足謂詞的元素數。 |
11 |
def drop(n: Int): Iterator[A] 這個推進過去迭代的前n個元素,或迭代器中的較小值長度。 |
12 |
def dropWhile(p: (A) => Boolean): Iterator[A] 跳過此迭代器滿足給定謂詞P元素的最長序列,並返回剩餘的元素的迭代器。 |
13 |
def duplicate: (Iterator[A], Iterator[A]) 創建兩個新的迭代,這兩個迭代相同的元件,因為這迭代(以相同的順序)。 |
14 |
def exists(p: (A) => Boolean): Boolean 返回true如果給定的斷言p成立一些由該迭代器所產生的值,否則為false。 |
15 |
def filter(p: (A) => Boolean): Iterator[A] 返回一個迭代在這個迭代器,滿足謂詞p的所有元素。元素的順序被保留。 |
16 |
def filterNot(p: (A) => Boolean): Iterator[A] 創建一個迭代器在這個迭代器不符合謂詞p的所有元素。 |
17 |
def find(p: (A) => Boolean): Option[A] 查找由該迭代器滿足謂詞,如果任意所產生的第一個值。 |
18 |
def flatMap[B](f: (A) => GenTraversableOnce[B]): Iterator[B] 創建一個新的迭代器通過應用功能,通過這個迭代器產生的所有值和串聯的結果。 |
19 |
def forall(p: (A) => Boolean): Boolean 返回true如果給定的斷言p成立了由該迭代器所產生的所有值,否則為false。 |
20 |
def foreach(f: (A) => Unit): Unit 應用一個函數f通過這個迭代器生成的所有值。 |
21 |
def hasDefiniteSize: Boolean 返回true如果是空迭代器,否則為false。 |
22 |
def indexOf(elem: B): Int 返回此迭代的對象的第一個出現的指定對象的索引。 |
23 |
def indexWhere(p: (A) => Boolean): Int 返回第一個生產值滿足謂詞的索引,或-1。 |
24 |
def isEmpty: Boolean 如果hasNext是false返回true,否則為false。 |
25 |
def isTraversableAgain: Boolean 測試這個迭代器是否可以反複運行。 |
26 |
def length: Int 返回此迭代的元素數。迭代器就是在這個方法返回後結束 |
27 |
def map[B](f: (A) => B): Iterator[B] 返回一個新的迭代器,其將通過這個迭代器生產應用函數 f 給它的每一個值 |
28 |
def max: A 查找最大元素。迭代器就是在這個方法返回後結束 |
29 |
def min: A 查找最小元素,迭代器就是在這個方法返回後結束 |
30 |
def mkString: String 顯示此遍曆的迭代器在一個字符串的所有元素 |
31 |
def mkString(sep: String): String 使用分隔字符串顯示在一個字符串這個遍曆的迭代器的所有元素 |
32 |
def nonEmpty: Boolean 測試可遍曆迭代器是不是為空 |
33 |
def padTo(len: Int, elem: A): Iterator[A] 追加的元素值到這個迭代器的一個給定目標長度 |
34 |
def patch(from: Int, patchElems: Iterator[B], replaced: Int): Iterator[B] 返回此迭代器補丁值 |
35 |
def product: A 這個集合中的元素相乘 |
36 |
def sameElements(that: Iterator[_]): Boolean 返回true,如果兩個迭代器產生相同的順序相同的元素,否則為false |
37 |
def seq: Iterator[A] 返回集合的順序視圖 |
38 |
def size: Int 返回此遍曆或迭代的元素數 |
39 |
def slice(from: Int, until: Int): Iterator[A] 創建一個迭代器返回由這個迭代器所產生的值區間 |
40 |
def sum: A 返回此遍曆的迭代器的所有元素的總和使用對於+運算符在num |
41 |
def take(n: Int): Iterator[A] 返回一個迭代隻生產這個迭代器,否則整個迭代器的前n個值,如果它產生少於n個值 |
42 |
def toArray: Array[A] 返回包含此遍曆的迭代器的所有元素的數組 |
43 |
def toBuffer: Buffer[B] 返回包含此遍曆的迭代器的所有元素的緩衝區 |
44 |
def toIterable: Iterable[A] 返回包含此遍曆的迭代器的所有元素一個可迭代,這不會終止無限迭代器 |
45 |
def toIterator: Iterator[A] 返回包含此遍曆的迭代器的所有元素的迭代器,這不會終止無限迭代器 |
46 |
def toList: List[A] 返回包含此遍曆的迭代器的所有元素的列表 |
47 |
def toMap[T, U]: Map[T, U] 返回包含此遍曆的迭代器的所有元素的映射 |
48 |
def toSeq: Seq[A] 返回包含此遍曆的迭代器的所有元素的序列 |
49 |
def toString(): String 此迭代器轉換為字符串 |
50 |
def zip[B](that: Iterator[B]): Iterator[(A, B) 返回一個新的包含迭代器對由此迭代器和相應的元素。由新的迭代器返回的元素數為最小值,通過此迭代器和返回元素的數目 |