迭代器、遍历器:
一个不落,挨个访问
package test_28
object Test {
def main(args: Array[String]): Unit = {
val list1 = List(1,2,3,4,5)
// 任务:输出每一个元素
list1.foreach(println)
// 任务:跳过前两个,从第三个开始输出
//迭代器
//1. 创建一个迭代器(iterator)
val it1 = list1.iterator
val it2 = it1.drop(2)
//2. 一次访问每个元素
while(it2.hasNext){
println(it2.next())
}
println(it2.hasNext)
val list2 = List(1,2,3)
val it3 = list2.iterator
it3.next()
it3.next()
it3.next()
// it3.next() // NoSuchElementException 没有这个元素。迭代器移过头了!!!
// 迭代器的使用场景:Map,List,Set......都可以使用迭代器来遍历
val m1 = Map("11"->1,"22"->2)
val s1 = Set("A","B","C")
val it4 = s1.iterator
while(it4.hasNext){
println(it4.next())
}
println("-"*20)
// 任务是:打印前3个
val list4 = List(1,2,3,4,5,6,7)
val it5 = list4.iterator
// take: 从当前的迭代器的位置开始,取n个元素
val it6 = it5.take(3)
while(it6.hasNext){
println(it6.next())
}
// 只输出4、5、6 跳过前三个,再取三个
val it7 = list4.iterator.drop(3).take(3)
while (it7.hasNext) {
println(it7.next())
}
// 复制迭代器
// 特点:不能回头
val list8 = List("A","B","C")
val (it8, it9) = list8.iterator.duplicate
while(it8.hasNext) {
println(it8.next())
}
println("-"*20)
println(it9.next())
println("-"*20)
// 作用:把迭代器中剩余1的数据保存到List中
val list9 = List(1,2,3,4)
val it10 = list9.iterator
it10.next()
//it10.next()
val list10 = it10.toList // 剩下的数据保存到List中
println(list10) //2,3,4
// zip: 拉链
// 作用:把两个迭代器组合成一个
val it11 = List(1,2,3,4,5,6,7,8).iterator
val it12 = List("one","two","three","four","five").iterator
val it13 = it11.zip(it12)
while(it13.hasNext) {
val rs = it13.next() // 元组
println(s"${rs._1} ----> ${rs._2}")
}
// 目标:输出
// 1 ----> one
// 2 ----> two
}
}
在scala中完成以下1操作:
1、创建学生信息数据结构和初始数据包。创建一个表示学生信息的类,case stud 包含姓名,年龄,和成绩列表【数学,英语,语文】等属性。然后创建几个学生对象,并将它们存储在一个列表中。
2、创建迭代器并进行基础遍历。为学生列表创建迭代器,使用迭代器的hasNext和next方法遍历学生信息,打印每个学生的姓名。
3、使用duplica方法和筛选操作。利用duplicate方法创建迭代器副本。在原迭代器1上根据年龄条件筛选年龄>20岁的同学,在副本迭代器上根据语文成绩条件筛选>80分的同学。
4、使用zip方法关联信息。创建一个新的列表用于存储每个学生的平均成绩(三门课的平均成绩),再创价吧该列表的迭代器。通过zip方法将学生迭代器和平均成绩迭代器组合,然后打印每个学生的姓名和平均成绩。
5、打印前三名的同学信息。
6、打印从第四名开始的后三位同学的信息。
7、重新创建学生列表的迭代器,用于统计所有学生的所以成绩的综合,并打印结果。
8、再次使用该迭代器,筛选出成绩列表中至少一个特定分数以上的学生信息,并打印他们的姓名和年龄。
// 1. 创建学生信息数据结构和初始数据包
case class Student(name: String, age: Int, scores: List[Double])
val students = List(
Student("Alice", 18, List(85.0, 90.0, 78.0)),
Student("Bob", 22, List(75.0, 80.0, 85.0)),
Student("Charlie", 20, List(90.0, 85.0, 92.0)),
Student("David", 25, List(88.0, 92.0, 80.0)),
Student("Eve", 19, List(70.0, 75.0, 80.0))
)
// 2. 创建迭代器并进行基础遍历
val studentIterator = students.iterator
while (studentIterator.hasNext) {
val student = studentIterator.next()
println(s"学生姓名: ${student.name}")
}
// 3. 使用duplicate方法和筛选操作
val (originalIterator, duplicateIterator) = studentIterator.duplicate
val filteredByAge = originalIterator.filter(_.age > 20)
while (filteredByAge.hasNext) {
val student = filteredByAge.next()
println(s"年龄大于20岁的学生: ${student.name}")
}
val filteredByChineseScore = duplicateIterator.filter(_.scores(2) > 80)
while (filteredByChineseScore.hasNext) {
val student = filteredByChineseScore.next()
println(s"语文成绩大于80分的学生: ${student.name}")
}
// 4. 使用zip方法关联信息
val averageScores = students.map(student => student.scores.sum / student.scores.length)
val averageScoreIterator = averageScores.iterator
val zipped = studentIterator.zip(averageScoreIterator)
while (zipped.hasNext) {
val (student, averageScore) = zipped.next()
println(s"学生姓名: ${student.name}, 平均成绩: $averageScore")
}
// 5. 打印前三名的同学信息
val topThree = students.take(3)
topThree.foreach(student => println(s"前三名同学信息: 姓名: ${student.name}, 年龄: ${student.age}, 成绩: ${student.scores}"))
// 6. 打印从第四名开始的后三位同学的信息
val fromFourth = students.drop(3).take(3)
fromFourth.foreach(student => println(s"从第四名开始的后三位同学信息: 姓名: ${student.name}, 年龄: ${student.age}, 成绩: ${student.scores}"))
// 7. 重新创建学生列表的迭代器,用于统计所有学生的所有成绩的总和,并打印结果
val totalScoreIterator = students.iterator
var totalScore = 0.0
while (totalScoreIterator.hasNext) {
val student = totalScoreIterator.next()
totalScore += student.scores.sum
}
println(s"所有学生的所有成绩总和: $totalScore")
// 8. 再次使用该迭代器,筛选出成绩列表中至少一个特定分数以上的学生信息,并打印他们的姓名和年龄
val specificScore = 85.0
val filteredBySpecificScore = students.iterator.filter(student => student.scores.exists(_ >= specificScore))
while (filteredBySpecificScore.hasNext) {
val student = filteredBySpecificScore.next()
println(s"成绩至少有一科大于等于 $specificScore 的学生: 姓名: ${student.name}, 年龄: ${student.age}")
}