将Map [String,String]附加到Seq [Map [String,String]]

时间:2013-09-27 10:23:35

标签: scala scala-collections

这让我发疯,我无法弄清楚为什么这会给我一个错误。

这是我的代码示例:

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 ??

有人有线索吗? 感谢

2 个答案:

答案 0 :(得分: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方法。

答案 1 :(得分:1)

简短foldLeft示例:

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