一、在本文中,我们将通过一个实际的Scala编程示例,深入探讨如何使用Scala的集合操作来处理学生信息。这个示例将展示如何创建学生列表,使用迭代器进行遍历,以及如何应用各种集合操作来筛选和关联数据。
1.定义学生信息
首先,我们定义一个Student
case class来表示学生信息,包括姓名、年龄、语文成绩和平均成绩。
case class Student(name: String, age: Int, chineseScore: Int, averageScore: Double)
2.创建学生列表
接下来,我们创建一个包含多个学生信息的列表。
val students = List(
Student("鲁班", 21, 85, 88.0),
Student("关羽", 19, 78, 75.5),
Student("嬴政", 22, 90, 92.0),
Student("商鞅", 20, 82, 80.0),
Student("荆轲", 23, 88, 97.5),
Student("韩信", 18, 70, 68.0)
)
3.迭代器基础遍历
我们使用迭代器来遍历学生列表,并打印每个学生的姓名。
val studentIterator = students.iterator
while (studentIterator.hasNext) {
println(studentIterator.next().name)
}
4.使用duplicate方法和筛选操作
利用duplicate
方法创建迭代器副本,分别根据年龄和语文成绩进行筛选。
val (olderStudentsIterator, highChineseScoreStudentsIterator) = students.iterator.duplicate
val olderStudents = olderStudentsIterator.filter(_.age > 20)
val highChineseScoreStudents = highChineseScoreStudentsIterator.filter(_.chineseScore > 80)
5.使用zip方法关联信息
我们创建一个新的列表来存储每个学生的平均成绩,然后使用zip
方法将学生信息和平均成绩关联起来。
val averageScores = students.map(_.averageScore)
val zipped = students.iterator.zip(averageScores.iterator)
while (zipped.hasNext) {
val (student, score) = zipped.next()
println(s"${student.name} - Average Score: $score")
}
6.打印特定学生信息
我们使用take
和drop
方法来打印前三名和从第四名开始的后三名学生的信息。
println("Top three students:")
students.take(3).foreach(println)
println("Next three students starting from the 4th:")
students.drop(3).take(3).foreach(println)
7.统计所有学生的平均成绩总和
我们重新创建学生列表的迭代器,用于统计所有学生的平均成绩总和。
val totalAverageScore = students.map(_.averageScore).sum
println(s"Total average score sum: $totalAverageScore")
8.筛选特定分数以上的学生
最后,我们筛选出平均成绩在特定分数以上的学生,并打印他们的姓名和年龄。
val highScoreThreshold = 80.0
val highScoreStudents = students.filter(_.averageScore >= highScoreThreshold)
println("Students with average score above the threshold:")
highScoreStudents.foreach(student => println(s"Name: ${student.name}, Age: ${student.age}"))
9.结论
通过这个示例,我们展示了Scala集合操作的强大功能,包括迭代器的使用、数据筛选、信息关联和数据统计。这些操作不仅提高了代码的可读性和简洁性,还增强了数据处理的能力。希望这篇文章能够帮助你更好地理解和应用Scala的集合操作,让你的粉丝在阅读你的博客时感到兴奋和满足。记住,掌握这些技巧,将使你的Scala编程技能更上一层楼!
二、完整代码块:
package Test11_18
case class Student(name: String, age: Int, chineseScore: Int, averageScore: Double)
object RW {
def main(args: Array[String]): Unit = {
val students = List(
Student("鲁班", 21, 85, 88.0),
Student("关羽", 19, 78, 75.5),
Student("嬴政", 22, 90, 92.0),
Student("商鞅", 20, 82, 80.0),
Student("荆轲", 23, 88, 97.5),
Student("韩信", 18, 70, 68.0)
)
// 2. 创建迭代器并进行基础遍历
val studentIterator = students.iterator
while (studentIterator.hasNext) {
println(studentIterator.next().name)
}
val (olderStudentsIterator, highChineseScoreStudentsIterator) = students.iterator.duplicate
// 在原迭代器上根据年龄条件筛选年龄>20岁的同学
val olderStudents = olderStudentsIterator.filter(_.age > 20)
// 在副本迭代器上根据语文成绩条件筛选>80分的同学
val highChineseScoreStudents = highChineseScoreStudentsIterator.filter(_.chineseScore > 80)
// 4. 使用zip方法关联信息
val averageScores = students.map(_.averageScore)
val zipped = students.iterator.zip(averageScores.iterator)
while (zipped.hasNext) {
val (student, score) = zipped.next()
println(s"${student.name} - Average Score: $score")
}
// 5. 打印前三名的同学信息
println("Top three students:")
students.take(3).foreach(println)
// 6. 打印从第4名开始的后3位同学的信息
println("Next three students starting from the 4th:")
students.drop(3).take(3).foreach(println)
// 7. 重新创建学生列表的迭代器,用于统计所有学生的所有成绩的总和,并打印结果
val totalAverageScore = students.map(_.averageScore).sum
println(s"Total average score sum: $totalAverageScore")
// 8. 再次使用该迭代器,筛选出成绩列表中有至少一个特定分数以上的学生信息,并打印他们的姓名和年龄
val highScoreThreshold = 80.0
val highScoreStudents = students.filter(_.averageScore >= highScoreThreshold)
println("Students with average score above the threshold:")
highScoreStudents.foreach(student => println(s"Name: ${student.name}, Age: ${student.age}"))
}
}