Scala - 迭代器



迭代器不是集合,而是一種逐一訪問集合元素的方式。迭代器 it 的兩個基本操作是nexthasNext。呼叫it.next() 將返回迭代器的下一個元素並推進迭代器的狀態。您可以使用迭代器的it.hasNext 方法來確定是否還有更多元素要返回。

遍歷迭代器返回的所有元素的最直接方法是使用 while 迴圈。讓我們遵循以下示例程式。

示例

object Demo {
   def main(args: Array[String]) {
      val it = Iterator("a", "number", "of", "words")
      
      while (it.hasNext){
         println(it.next())
      }
   }
}

將上述程式儲存到Demo.scala 中。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

a
number
of
words

查詢最小和最大值元素

您可以使用it.minit.max 方法從迭代器中找出最小和最大值元素。在這裡,我們使用itaitb 執行兩個不同的操作,因為迭代器只能遍歷一次。以下是示例程式。

示例

object Demo {
   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 )
   }
}

將上述程式儲存到Demo.scala 中。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

Maximum valued element 90
Minimum valued element 2

查詢迭代器的長度

您可以使用it.sizeit.length 方法來找出迭代器中可用的元素數量。在這裡,我們使用 ita 和 itb 執行兩個不同的操作,因為迭代器只能遍歷一次。以下是示例程式。

示例

object Demo {
   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 )
   }
}

將上述程式儲存到Demo.scala 中。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

Value of ita.size : 6
Value of itb.length : 6

Scala 迭代器方法

以下是在使用迭代器時可以使用的一些重要方法。有關可用方法的完整列表,請檢視 Scala 的官方文件。

序號 方法及描述
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

如果此迭代器生成的某些值滿足給定謂詞 p,則返回 true,否則返回 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

如果給定謂詞 p 對此迭代器生成的所有值都成立,則返回 true,否則返回 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)

返回一個新的迭代器,其中包含由此迭代器的對應元素組成的對。新迭代器返回的元素數量與迭代器(A 或 B)返回的元素數量的最小值相同。

scala_collections.htm
廣告