从文件创建HashMap

时间:2014-11-18 06:00:21

标签: scala

我正在尝试加载一个3列文件test.txt并从数据中创建一个HashMap,其中第一列是键,后两列构成值。以下是test.txt文件的样子:

afpoafi,oiqfj,qoifejpof
qopifjew,qofie,qowiefj

这是我的代码及其产生的错误:

val invMapData = scala.io.Source.fromFile("/Users/Documents/test.txt")
val invLines = invMapData.getLines

var invMap = new HashMap[String,(String,String)]()
for (i <- invLines) {
       var temp = i.split(',')
       invMap = invMap ++ List(temp(0),(temp(1),temp(2)))
    }

<console>:20: error: type mismatch;
 found   : scala.collection.mutable.Iterable[java.io.Serializable]
 required: scala.collection.mutable.HashMap[String,(String, String)]
                invMap = invMap ++ List(temp(0),(temp(1),temp(2)))

我会提到将for循环更改为:

for (i <- invLines) { println(i)}

完美打印出值。这里出了什么问题,为什么Scala在“i”是字符串时找到一个Iterable文件类型?

2 个答案:

答案 0 :(得分:3)

如上所述,++上的操作数类型不匹配,但考虑使用不可变集合的此版本,

val invMap = io.Source.fromFile("test.txt").getLines.map { 
  l => 
    val Array(k,v1,v2,_*) = l.split(',')
    k -> (v1,v2) }.toMap

分割每行的前三项被提取并转换为元组的关联。

答案 1 :(得分:1)

invMap = invMap ++ List(temp(0),(temp(1),temp(2)))行有两个错误:

  • 方法++接受Map参数,但Iterable
  • 如果您想在地图中添加新的键值对,请使用->创建配对,添加+= 它来映射。

使用invMap += temp(0) -> (temp(1),temp(2))代替该行。