迭代器、遍历器:
一个不落,挨个访问
package test_28object Test {def main(args: Array[String]): Unit = {val list1 = List(1,2,3,4,5)// 任务:输出每一个元素list1.foreach(println)// 任务:跳过前两个,从第三个开始输出//迭代器//1. 创建一个迭代器(iterator)val it1 = list1.iteratorval it2 = it1.drop(2)//2. 一次访问每个元素while(it2.hasNext){println(it2.next())}println(it2.hasNext)val list2 = List(1,2,3)val it3 = list2.iteratorit3.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.iteratorwhile(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.duplicatewhile(it8.hasNext) {println(it8.next())}println("-"*20)println(it9.next())println("-"*20)// 作用:把迭代器中剩余1的数据保存到List中val list9 = List(1,2,3,4)val it10 = list9.iteratorit10.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).iteratorval it12 = List("one","two","three","four","five").iteratorval 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.duplicateval 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.iteratorval 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}")
}