我正在尝试加载一个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文件类型?
答案 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))
代替该行。