Scala中使用scanLeft处理列表映射时出现报错的问题咨询
问题分析与解决
错误原因
你遇到的报错是因为scanLeft的第二个参数需要传入函数对象,但你直接传了方法mergeNodes——虽然Scala支持把方法隐式转换为函数,但这里编译器没能自动完成转换,所以提示缺少参数列表。
另外还有个隐藏问题:Scala默认的Map是无序的(比如HashMap),直接对它调用scanLeft的话,遍历顺序不固定,大概率得不到你想要的按"1992"→"1993"顺序合并的结果。
修正后的代码
步骤1:确保遍历顺序
先把Map转成有序的键值对序列,比如按键排序:
// 按键的字符串顺序排序,得到有序的键值对列表 val sortedEntries = dummy.toList.sortBy(_._1)
步骤2:修正scanLeft的函数参数
把方法转成函数(加_),或者直接用匿名函数:
def mergeNodes(tuple1: (String, List[String]), tuple2: (String, List[String])): (String, List[String]) = (tuple2._1, tuple1._2 ++ tuple2._2) val dummy = Map("1992" -> List("1", "2"), "1993" -> List("4", "5")) val sortedEntries = dummy.toList.sortBy(_._1) // 方法转函数:加_让编译器识别为函数对象 val resList = sortedEntries.scanLeft(("", List.empty[String]))(mergeNodes _)
步骤3:转成目标Map
scanLeft返回的是包含初始值和每一步结果的列表,我们需要跳过第一个空初始值,再转成Map:
val result = resList.tail.toMap // 输出结果:Map(1992 -> List(1, 2), 1993 -> List(1, 2, 4, 5))
完整可运行代码
def mergeNodes(tuple1: (String, List[String]), tuple2: (String, List[String])): (String, List[String]) = (tuple2._1, tuple1._2 ++ tuple2._2) val dummy = Map("1992" -> List("1", "2"), "1993" -> List("4", "5")) val sortedEntries = dummy.toList.sortBy(_._1) val resList = sortedEntries.scanLeft(("", List.empty[String]))(mergeNodes _) val result = resList.tail.toMap println(result) // 验证结果符合预期
内容的提问来源于stack exchange,提问作者Robur_131
相关产品推荐
相关产品推荐

