Scala中计算并比较Map两行数据最大平均值的问题排查
问题分析
错误信息翻译:未指定值参数:g: String => (String, Int)
核心问题是函数签名不匹配+调用参数错误:
averageStockLevel1的签名是(String, String) => (String, Int),但menuShowDoubleDataStock要求传入两个(String) => (String, Int)类型的单参数函数handleFour调用menuShowDoubleDataStock时只传了一个参数,既缺少第二个参数g,同时传入的averageStockLevel1类型也不匹配
解决方案
调整函数设计,让逻辑更清晰且匹配调用需求:
1. 拆分单股票平均值计算函数
先实现一个仅计算单支股票平均值的函数,适配菜单输入的单参数需求:
// 计算单支股票的平均值,返回(股票代码, 平均值) def getStockAverage(stockCode: String): (String, Int) = { val avg = mapdata.get(stockCode) .map(list => average(list).toInt) .getOrElse(0) (stockCode, avg) }
2. 实现两支股票平均值比较函数
基于单股票计算函数,完成比较逻辑:
// 比较两支股票,返回平均值更大的那支 def compareStockAverages(stock1: String, stock2: String): (String, Int) = { val (code1, avg1) = getStockAverage(stock1) val (code2, avg2) = getStockAverage(stock2) if (avg1 > avg2) (code1, avg1) else (code2, avg2) }
3. 调整菜单调用逻辑
修改菜单函数,直接整合输入、计算、比较的完整流程:
// 读取两支股票输入,显示各自平均值并输出较大的那支 def menuShowDoubleDataStock(): Unit = { print("请输入第一支股票代码 > ") val stock1 = readLine().trim val data1 = getStockAverage(stock1) println(s"${data1._1}: ${data1._2}") print("请输入第二支股票代码 > ") val stock2 = readLine().trim val data2 = getStockAverage(stock2) println(s"${data2._1}: ${data2._2}") val result = compareStockAverages(stock1, stock2) println(s"平均值更高的股票:${result._1},平均值:${result._2}") } def handleFour(): Boolean = { menuShowDoubleDataStock() true }
4. 保留原平均值计算函数
原列表平均值计算函数可继续使用:
// 计算列表平均值 def average(list: List[Int]): Double = list.sum.toDouble / list.size
关键说明
- 拆分单股票计算函数,让函数职责更单一,同时适配了菜单输入的单参数逻辑
- 调整后的菜单函数不再依赖外部传入的函数参数,彻底避免类型不匹配问题
- 完整覆盖需求:读取两支股票→计算各自平均值→比较并输出结果
内容的提问来源于stack exchange,提问作者Dramane Kone
相关产品推荐
相关产品推荐

