迭代器的定义
迭代器 Iterator是一种用于遍历集合元素的对象。它提供了统一的方式来访问各种集合类 型(如列表List、映射Map、集合Set等)中的元素,而不需要了解集合的内部结构。
在 Scala 中,迭代器是一种抽象的概念,它有特定的接口和方法来实现元素的遍历。
iterator方法创建对应的迭代器,这个迭代器可以用于遍历列表中的元素。
/*
* List(1,2,3,4,5)
* */
object iterator01 {
def main(args: Array[String]): Unit = {
val list1 = scala.collection.immutable.List(1,2,3,4,5)
// list1.foreach(ele => {
// println(ele)
// }) 1 2 3 4 5
// 跳过list的前面两个元素,输出后两个元素
val it = list1.iterator
val it1 = it.drop(2).take(2)
while(it1.hasNext){
println(it1.next()) //3 4
}
}
}
next方法获取一个元素
package iterator
/*
* 迭代器.next() 获取当前元素,移动迭代器
* */
object iterator02 {
def main(args: Array[String]): Unit = {
val list1 = List(1,2,3,4,5)
// 访问这五个元素:
// 1.获取迭代器
val it = list1.iterator //默认指向第一个元素
// 2.移动迭代器
// val value = it.next() // 获取,移动
// println(value) // 1
// 3.输出对应的值
println(it.next()) // 1
println(it.next()) // 2
println(it.next()) // 3
println(it.next()) // 4
println(it.next()) // 5
println(it.next()) // 越界 会报错 java.util.NoSuchElementException: head of empty list
}
}
hasNext方法检查是否还有下一个元素,防止越界
// 访问这五个元素:
// 1.获取迭代器
val it = list1.iterator //默认指向第一个元素
// 2.移动迭代器
// val value = it.next() // 获取,移动
// println(value) // 1
// 3.输出对应的值
// println(it.next()) // 1
// println(it.next()) // 2
// println(it.next()) // 3
// println(it.next()) // 4
// println(it.next()) // 5
if(it.hasNext){
println(it.next())
}
// println(it.next()) // 越界 会报错 java.util.NoSuchElementException: head of empty list
drop方法会跳过指定数量的元素,take方法会获取指定数量的元素
package iterator
/*
* drop:跳过指定个数的元素drop(3)
* take:获取指定数量的元素
*/
object iterator03 {
def main(args: Array[String]): Unit = {
val list1 = List(1,2,3,4,5)
val it = list1.iterator
val it2 = it.drop(1) // 跳过一个元素
while (it2.hasNext){
println(it2.next())
}
println("---------------")
val it3 = it.take(3) //从当前位置开始,只获取两个元素
while (it3.hasNext){
println(it3.next()) // 1 2 3
}
}
}
duplicate方法会复制迭代器
package iterator
// 迭代器是一次性的,一旦next之后就不能回头
object iterator04 {
def main(args: Array[String]): Unit = {
val list1 = List(1,2,3,4,5)
val it = list1.iterator
val (it1,it2) = it.duplicate
it1.next() // 一次性
it1.next()
while (it.hasNext){
println(it.next()) // 3 4 5
}
println("-------------------")
while(it2.hasNext){
println(it2.next()) // 1 2
}
}
}
toList方法会把迭代器中剩余的元素转入一个新的List中
package iterator
object iterator05 {
def main(args: Array[String]): Unit = {
val list1 = List(1,2,3,4,5)
val it = list1.iterator
it.next()
it.next()
println(it.next()) // 3
// 希望把剩下的内容,装入一个新的List
val newList = it.toList
println(newList) // List(4, 5)
}
}
zip方法会将两个迭代器的元素按照顺序组合成一个新的迭代器。
如果长度不一,会以短的为准
package iterator
object iterator06 {
def main(args: Array[String]): Unit = {
val it1 = List(1,2,3,4,5,6).iterator
val it2 = List("one","two","three","four","five").iterator
val it3 = it1.zip(it2)
while (it3.hasNext){
val pair = it3.next()
println(pair._1,pair._2) // (1,one) (2,two) (3,three) (4,four) (5,five)
}
}
}