scala中迭代器、遍历器的使用

发布于:2024-12-06 ⋅ 阅读:(96) ⋅ 点赞:(0)

迭代器、遍历器:

一个不落,挨个访问

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}")
}


网站公告

今日签到

点亮在社区的每一天
去签到