2013-09-27 223 views
0

这让我发疯,我想不通为什么这给了我一个错误。追加映射[字符串,字符串]到一个序列[映射[字符串,字符串]]

这里我的代码示例:

var seqOfObjects:Seq[Map[String, String]] = Seq[Map[String, String]]() 
for(item <- somelist) { 
    seqOfObjects += Map(
    "objectid" -> item(0).toString, 
    "category" -> item(1), 
    "name" -> item(2), 
    "url" -> item(3), 
    "owneremail" -> item(4), 
    "number" -> item(5).toString) 
} 

这给了我一个错误说:

Type mismatch, expected: String, actual: Map[String, String] 

Map[String, String]正是我要追加到我Seq[Map[String, String]]什么。

为什么说我的变量seqOfObjects预计String

任何人都有线索? 由于

回答

3

a += b装置a = a.+(b)。见this answer

有没有方法+Seq,所以你不能使用+=

scala> Seq[Int]() + 1 
<console>:8: error: type mismatch; 
found : Int(1) 
required: String 
       Seq[Int]() + 1 
         ^

required: String是从字符串连接。这种行为是从Java继承:

scala> List(1, 2, 3) + "str" 
res0: String = List(1, 2, 3)str 

其实方法+这里是StringAdd包装。请参阅隐式方法Predef.any2stringadd

您可以使用:+=+:=而不是+=

Seq默认实现List,所以你应该使用+:+:=代替:+:+=。请参阅scala集合的Performance Characteristics

您也可以使用List而不是Seq。有一个在List::方法,所以你可以使用::=

var listOfInts = List[Int]() 
listOfInts ::= 1 

您可以重写代码,而无需使用map可变的变量:

val seqOfObjects = 
    for(item <- somelist) // somelist.reverse to reverse order 
    yield Map(...) 

为了扭转要素命令你可以使用reverse方法。

+0

好吧,我明白了,我甚至没有想过+ =因为那不是错误。但它看起来像是:) 谢谢@senia,这有助于很多! – raxelsson

1

foldLeft例如:

sl.foldLeft(Seq[Map[Srting, String]]()){ (acc, item) => Map(/* map from item */) +: acc } 
+0

谢谢你回答@Alexlv,我会看看这个。看起来很有趣! – raxelsson