![](/img/trans.png)
[英]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.