Scala 迭代器
迭代器不是一个集合,而是一种逐个访问集合元素的方式。对于一个迭代器 it ,有两个基本操作: next 和 hasNext 。调用 it.next() 会返回迭代器的下一个元素并使迭代器的状态前进。使用Iterator的 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.min 和 it.max 方法从迭代器中查找最小和最大值的元素。在这里,我们使用 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("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.size或it.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中,并返回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] ** 查找迭代器中满足谓词p的第一个元素(如果存在)。 |
18 | def flatMap[B](f: (A) = > GenTraversableOnce[B]): Iterator[B] 通过将函数f应用于迭代器中的所有值并连接结果,创建一个新的迭代器。 |
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] 返回一个包含此可遍历对象或迭代器所有元素的Iterable。对于无限迭代器,此方法将不会终止。 |
45 | def toIterator: Iterator[A] 返回一个包含此可遍历对象或迭代器所有元素的Iterator。对于无限迭代器,此方法将不会终止。 |
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)返回的最小元素数相同。 |