You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码说明

  1. groupMap(_.date):先按考试日期将所有成绩分组,得到Map[LocalDate, Seq[Score]]。
  2. 对每个日期分组内的Seq[Score],用groupBy(_.name)按学生姓名再次分组,得到Map[String, Seq[Score]]。
  3. 遍历每个学生的成绩列表,计算每份成绩的总分,用max取最高分,最终生成(姓名→最高总分)的键值对,合并为单个Map[String, Int]。
  4. 最终groupMap的返回类型即为Map[LocalDate, Map[String, Int]],完全符合需求。

内容的提问来源于stack exchange,提问作者user20280341

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:35:22