Scala 将字符串转换为映射(字符串,列表([Int,Int]))

Scala 将字符串转换为映射(字符串,列表([Int,Int])),scala,Scala,我目前正在学习Scala,我正在尝试从文件中读取文本行,并将其转换为类型为-map[String,List[(Int,Int)]]的映射,但很难实现 文件中的文本示例=London,-1:19,-2:21,0:18,-3:24 我希望它返回为-Map(London->List(-1,19),-2,21),-0,18),-3,24)) 我可以通过以下方式获得城市名称: for (line <- Source.fromFile(filename).getLines()) { v

我目前正在学习Scala,我正在尝试从文件中读取文本行,并将其转换为类型为-
map[String,List[(Int,Int)]]
的映射,但很难实现

文件中的文本示例=
London,-1:19,-2:21,0:18,-3:24

我希望它返回为-
Map(London->List(-1,19),-2,21),-0,18),-3,24))

我可以通过以下方式获得城市名称:

for (line <- Source.fromFile(filename).getLines()) {
        val splitLine = line.split(",").map(_.trim)
        val city = splitLine.head
用于(第行){
val y=x.split(“:”);(y(0).toInt,y(1).toInt)
})(托利斯特先生)
结果
}
您可以在一行中完成,如下所示

result
是一个
迭代器
,因此您应该相应地更改返回类型

def readFile(filename: String): Iterator[Map[String, List[(Int, Int)]]] = {
    val result = for (line <- Source.fromFile(filename).getLines(); array = line.split(",").map(_.trim)) yield Map(array.head -> array.tail.map(x => {
      val y = x.split(":"); (y(0).toInt, y(1).toInt)
    }).toList)
    result
  }

您可以按照以下操作获得所需的
Map[String,List[(Int,Int)]]]

for {
 line <- Source.fromFile(filename).getLines()
 val array = line.split(",")
}yield Map(array.head -> array.tail.toList.map(_.split(":").map(_.trim.toInt)).map(elem => (elem(0), elem(1))))
用于{
linearray.tail.toList.map(u.split(“:”).map(u.trim.toInt)).map(elem=>(elem(0),elem(1)))

最大的逻辑是在尾部管理中,将其转换为整数元组。

我尝试过此解决方案,但“非空迭代器”出现错误,我添加了一个编辑,其中包含我尝试执行的完整方法。你应该尝试我的方法,是吗?是的,我尝试过你的方法,这似乎是最好的方法,但我得到的错误是“类型迭代器[Map[String,List[(Int,Int)]]的表达式与预期的类型Map[String,List[(Int,Int)]]不符”-使用您在操作中的方法添加了代码。这些更改很有效,谢谢!我不太希望它以我希望的方式显示,因为添加到文件中的其他城市会给我类似的输出:
List(Map(London->List(-1,19),-2,21),-0,18)地图(爱丁堡->列表(-3,16),(-2,19),(-1,21))等。
代替地图(伦敦->列表(-1,19),(-2,21),(0,18),(-3,24)),爱丁堡->列表(-3,16),(-2,19),(-1,21)))几乎像一对键/值配对谢谢,效果很好!:)我还没有遇到flatten,但是在阅读了上面的文档之后,使用它是非常有意义的!再次感谢
Map(London -> List((-1,19), (-2,21), (0,18), (-3,24)))
//Iterator[Map[String, (Int, Int}]]
def readFile(filename: String): Iterator[Map[String, List[(Int, Int)]]] = {
    val result = for (line <- Source.fromFile(filename).getLines(); array = line.split(",").map(_.trim)) yield Map(array.head -> array.tail.map(x => {
      val y = x.split(":"); (y(0).toInt, y(1).toInt)
    }).toList)
    result
  }
def readFile(filename: String): List[Map[String, List[(Int, Int)]]] = {
  val result = for (line <- Source.fromFile(filename).getLines(); array = line.split(",").map(_.trim)) yield Map(array.head -> array.tail.map(x => {
    val y = x.split(":"); (y(0).toInt, y(1).toInt)
  }).toList)
  result.toList
}
def readFile(filename: String): Map[String, List[(Int, Int)]] = {
  val result = for (line <- Source.fromFile(filename).getLines(); array = line.split(",").map(_.trim)) yield Map(array.head -> array.tail.map(x => {
    val y = x.split(":"); (y(0).toInt, y(1).toInt)
  }).toList)
  result.toList.flatten.toMap
}
for {
 line <- Source.fromFile(filename).getLines()
 val array = line.split(",")
}yield Map(array.head -> array.tail.toList.map(_.split(":").map(_.trim.toInt)).map(elem => (elem(0), elem(1))))