Scala中'type mismatch'类型不匹配错误的解决方法
Scala成绩映射函数:类型匹配修复与最高分逻辑实现
原代码与问题
import java.time.LocalDate object Main extends App{ val scores: Seq[Score] = Seq(score1, score2, score3, score4) println(getDate(scores)(LocalDate.of(2020, 1, 30))("Alice")) def getDate(scoreSeq: Seq[Score]): Map[LocalDate, Map[String, Int]] = scores.groupMap(score => score.date)(score=>Map(score.name -> (score.english+score.math+score.science))) }
需求是实现一个函数,将考试日期映射为「学生姓名→当日三科总分」的映射表;若同一学生在同一日期有多份成绩,需保留总分最高的那一项。但当前代码出现类型不匹配错误:实际返回类型为scala.collection.immutable.Map[java.time.LocalDate,Seq[scala.collection.immutable.Map[String,Int]]],与要求的Map[java.time.LocalDate,Map[String,Int]]不符。
问题原因
groupMap的第二个参数会将分组内的每个元素转换为指定类型,最终每个分组的结果是该类型的Seq。原代码中每个Score被转成了单独的Map[String, Int],所以分组后得到的是Seq[Map[String, Int]],而非目标的单个Map[String, Int]。
修复方案
需要对groupMap分组后的每个日期组进一步处理:先按学生姓名分组,再对每个学生的多份成绩计算总分并取最大值,最后合并为单个Map[String, Int]。
完整修复代码(包含Score类定义):
import java.time.LocalDate // 补充Score类定义 case class Score(name: String, date: LocalDate, english: Int, math: Int, science: Int) object Main extends App { // 示例数据 val score1 = Score("Alice", LocalDate.of(2020, 1, 30), 80, 90, 85) val score2 = Score("Alice", LocalDate.of(2020, 1, 30), 85, 95, 90) // 更高分 val score3 = Score("Bob", LocalDate.of(2020, 1, 30), 75, 80, 70) val score4 = Score("Alice", LocalDate.of(2020, 2, 1), 90, 85, 95) val scores: Seq[Score] = Seq(score1, score2, score3, score4) println(getDate(scores)(LocalDate.of(2020, 1, 30))("Alice")) // 输出270 def getDate(scoreSeq: Seq[Score]): Map[LocalDate, Map[String, Int]] = { scoreSeq.groupMap(_.date) { dateGroup => // 对同一日期的所有成绩,按姓名分组 dateGroup.groupBy(_.name).map { case (name, scores) => // 计算该学生所有成绩的总分,取最大值 val maxTotal = scores.map(s => s.english + s.math + s.science).max name -> maxTotal } } } }
代码说明
groupMap(_.date):先按考试日期将所有成绩分组,得到Map[LocalDate, Seq[Score]]。- 对每个日期分组内的
Seq[Score],用groupBy(_.name)按学生姓名再次分组,得到Map[String, Seq[Score]]。 - 遍历每个学生的成绩列表,计算每份成绩的总分,用
max取最高分,最终生成(姓名→最高总分)的键值对,合并为单个Map[String, Int]。 - 最终
groupMap的返回类型即为Map[LocalDate, Map[String, Int]],完全符合需求。
内容的提问来源于stack exchange,提问作者user20280341
相关产品推荐
相关产品推荐

