Scala嵌套地图 - 如何处理?

时间:2017-04-26 20:37:23

标签: scala csv nested maps

这是我的嵌套地图示例,其中数据为文字。该计划按预期运作。

    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

3 个答案:

答案 0 :(得分: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}  

答案 1 :(得分: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中嵌套关联数组的副本。有一天,我会开始在Scala中思考。

答案 2 :(得分:0)

专门解决编译错误:

您已声明outer地图的密钥为String且价值为String

但稍后当你执行outer(cols(0)) = ???时,你会说&#34;我想把这个值放在键cols(0)&#34;上。

因此,编译器会抱怨您尝试插入地图的内容与预期String的类型不同。

注意:Scala中不鼓励使用可变性。除非你真的需要,否则你可以使用不可变集合编写相同类型的代码。