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]

但 aMap[String, String]正是我想要附加到我的Seq[Map[String, String]].

为什么说我的变量seqOfObjects需要一个String??

有人有线索吗?谢谢

4

2 回答 2

3

a += b意味着a = a.+(b)。看到这个答案

中没有方法+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

您可以使用:+=or+:=代替+=.

Seqis的默认实现List,因此您应该使用+:and+:=而不是:+and :+=。请参阅Scala 集合的性能特征

您也可以使用List代替Seq. 中有::方法List,因此您可以使用::=

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

您可以使用以下方法重写没有可变变量的代码map

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

要反转元素顺序,您可以使用reverse方法。

于 2013-09-27T10:28:42.823 回答
1

简短的foldLeft例子:

sl.foldLeft(Seq[Map[Srting, String]]()){ (acc, item) =>  Map(/* map from item */) +: acc }
于 2013-09-27T10:26:28.953 回答