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
相关产品推荐
相关产品推荐

