[英]Convert List[Map[String,Map[String,Int]]] to Map[Int,Int] in Scala
[英]Convert a String to Map(String, List([Int,Int]))
我目前正在学习Scala,并且尝试从文件中读取文本行并将其转换为Map[String, List[(Int,Int)]]
类型的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
但是在此之后,我无法走得更远,我无法将其余的值拆分为一个整数列表。
编辑:
添加完整方法以进行澄清
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
}
您可以一行完成
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(London -> List((-1,19), (-2,21), (0,18), (-3,24)))
//Iterator[Map[String, (Int, Int}]]
result
是一个Iterator
因此您应该相应地更改返回类型
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
}
迭代器并不是真正的集合,也不安全,所以我建议您返回list而不是
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
}
您的评论表明您想要
并不是我希望将其显示为添加到文件中的其他城市的方式会给我这样的输出:
List(Map(London -> List((-1,19), (-2,21), (0,18), (-3,24))), Map(Edinburgh -> List((-3,16), (-2, 19), (-1, 21)))
等...而不是Map(London -> List((-1,19), (-2,21), (0,18), (-3,24))), Edinburgh -> List((-3,16), (-2, 19), (-1, 21)))
几乎就像一个键/值对
为此,您需要做的是.flatter.toMap
并将返回类型更改为Map[String, List[(Int, Int)]]
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
}
您可以执行以下操作以根据需要获取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))))
最大的逻辑是在尾巴管理中,将其转换为Ints元组
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.