2017-04-26 45 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