2017-04-26 46 views
1

這是我的嵌套地圖示例,數據爲文字。該程序按預期工作。斯卡拉嵌套地圖 - 如何處理?

var x = scala.collection.mutable.Map(
     ("Early", Map(("a", 1), ("b", 2))), 
     ("Late", Map(("x", 24), ("y", 25)))) 

for (ticker <- x.keys) { 
    val trades = x(ticker) 
    for (tradetime <- trades.keys) { 
     val tradetotal = trades(tradetime) 
     println(ticker + " | " + tradetime + " | " + tradetotal) 
    } 
    println(ticker + " | " + trades) 
} 

但是,我想消除文字,並從csv文件中讀取上述值。這裏是csv:

Early,a,1 
Early,b,2 
Late,x,24 
Late,y,25 

這是讀取csv並以類似於以上程序文字打印出來的值的代碼。

val bufferedSource = io.Source.fromFile("mapt.csv") 
    val builder = StringBuilder.newBuilder 

    for (line <- bufferedSource.getLines) { 
    val cols = line.split(",").map(_.trim) 
    println(s"${cols(0)}|${cols(1)}|${cols(2)}") 
    var tmp = cols(0) // s"${cols(0)}" 

    val inner = scala.collection.mutable.Map.empty[String, Int] 
    inner(cols(1)) = cols(2).toInt 
    println(inner) 

    val outer = scala.collection.mutable.Map.empty[String, String] 
    outer(cols(0)) = inner 
    println(outer) 

    } 
    bufferedSource.close 

我的代碼無效。我正在努力尋找關於如何處理嵌套地圖的指導。我正在學習Scala。感謝任何建議,從csv文件數據創建嵌套的地圖。

我得到以下錯誤:

enter image description here

+0

你得到什麼錯誤? – mfirry

+0

我添加了錯誤的屏幕截圖。 – Fred

回答

3
val lines = scala.io.Source.fromFile("mapt.csv").getLines() 
val row = lines.map(_.split(",").map(_.trim)) 
val outerMap=row.groupBy(_.head) 
val result = outerMap.map{case (key,values)=> 
    key-> values.map(v=>(v(1)->v(2))).toMap} 
+0

不錯。我認爲使用'mapValues()'可以簡化最後一行。 – jwvh

0

感謝您的回答,亞嫩。你的最後一行讓我感到困惑。但是,它向我展示了一種幫助我解決問題的新技術。這是我的工作代碼:

val bufferedSource = io.Source.fromFile("mapt.csv") 
    val builder = StringBuilder.newBuilder 

    for (line <- bufferedSource.getLines) { 
    val cols = line.split(",").map(_.trim) 
    println(s"${cols(0)}|${cols(1)}|${cols(2)}") 

    val outerMap = Map(cols(0) -> Map(cols(1) -> cols(2).toInt)) 
    println("outerMap looks like this: " + outerMap) 
    println("Accessing the lowest-level value: " + outerMap(cols(0))(cols(1))) 
    } 
    bufferedSource.close 

我的想法是有缺陷的,我知道。上述方法是我如何在awk中嵌套關聯數組的副本。有一天我會開始思考斯卡拉。

你,說明該outer地圖有String鍵和String值:

0

要重點解決您的編譯錯誤。

但後來當你做outer(cols(0)) = ???你說:「我想把這個值在關鍵cols(0)」。

所以編譯器會抱怨你試圖插入到地圖中的類型與預期的String不同。

注意:在Scala中不鼓勵可變性。除非您真的需要,否則您可以使用不可變集合編寫相同類型的代碼。

+1

感謝您的明確解釋和建議,mfirry。我需要我所能得到的一切。正如你所看到的,我還在爬行,還沒有開始走路。有一天,我將成爲一名優秀的Scala程序員! – Fred