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

Scala实现:将文件文本转换为Map["String", List[(Int,Int)]]

解决Scala文件转Map[String, List[(Int,Int)]]的问题

嘿,你已经成功拿到城市名称了,离目标只差一步!咱们把剩下的数字对处理逻辑补上,就能得到你想要的映射啦。

完整实现代码

这里直接给你能跑通的完整代码,每一步我都加了注释:

import scala.io.Source

def convertFileToMap(filename: String): Map[String, List[(Int, Int)]] = {
  // 读取文件所有行,逐行处理
  Source.fromFile(filename)
    .getLines()
    .map { line =>
      // 按逗号分割并去除每个元素的前后空格
      val splitLine = line.split(",").map(_.trim)
      // 第一个元素就是城市名称
      val cityName = splitLine.head
      // 处理剩下的所有数字对字符串
      val temperaturePairs = splitLine.tail.map { pairStr =>
        // 按冒号分割成键和值,转成Int类型后组成元组
        val Array(key, value) = pairStr.split(":").map(_.toInt)
        (key, value)
      }.toList
      // 返回城市名和对应列表的键值对
      cityName -> temperaturePairs
    }
    .toMap // 将所有行的键值对转换为Map
}

关键步骤解释

  • 分割与清洗:line.split(",").map(_.trim)确保分割后的元素没有多余空格,避免处理" -1:19"这种带空格的字符串时出错。
  • 处理数字对:splitLine.tail获取除城市名外的所有元素,对每个pairStr用split(":")分割,再转成Int元组,最后转成List。
  • 生成Map:每行处理后得到(城市名, 数字对列表)的结构,用toMap直接转换成目标类型。

容错优化(可选)

如果文件里可能存在格式错误(比如某个条目不是x:y格式,或者无法转成Int),可以用flatMap和try-catch跳过错误条目,避免程序崩溃:

val temperaturePairs = splitLine.tail.flatMap { pairStr =>
  pairStr.split(":") match {
    case Array(k, v) =>
      try {
        Some(k.toInt -> v.toInt)
      } catch {
        case _: NumberFormatException => 
          println(s"忽略格式错误的条目: $pairStr")
          None
      }
    case _ =>
      println(s"忽略格式错误的条目: $pairStr")
      None
  }
}.toList

测试效果

用你给出的示例行:

London, -1:19, -2:21, 0:18, -3:24

运行代码后会得到:

Map(London -> List((-1,19), (-2,21), (0,18), (-3,24)))

完全符合你的预期!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:44:52