Scala向List [Map [String,Double]]的每个元素插入新键

时间:2018-11-29 11:42:41

标签: scala

我有一个地图列表,如下所示。

val data = List(
    Map("a" -> 1.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0), Map("a" -> 1.0, "b" -> 2678.0, "c" -> 40.0, "d" -> 2.0), Map("a" -> 4.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0), Map("a" -> 1.0, "b" -> 2678.0, "c" -> 90.0, "d" -> 17.0)
)

我想为列表中的每个地图(元素)插入一个键。

say键为“ k”,值为1

所以,结果应该像

 List(Map(a -> 1.0, b -> 267.0, c -> 26.0, k -> 1, d -> 2.0), Map(a -> 1.0, b -> 2678.0, c -> 40.0, k -> 1, d -> 2.0), Map(a -> 4.0, b -> 267.0, c -> 26.0, k -> 1, d -> 2.0), Map(a -> 1.0, b -> 2678.0, c -> 90.0, k -> 1, d -> 17.0))

我使用下面的代码获得相同的结果

var result:List[Map[String,Double]] = List.empty
result = result ::: data(key).map(x=>x.++(Map("k"->1)))

但是它消耗了太多时间。一个列表中的10万个元素大约需要300毫秒

还有其他有效的方法可以做到这一点。理想的时间消耗应该为0。

1 个答案:

答案 0 :(得分:0)

这应该足够快:

  val m = (1 to 1000).map(_.toString).zipWithIndex.toMap // Map(710 -> 709, 205 -> 204, 45 -> 44, ...

  val start = System.currentTimeMillis()
  val l2 = (1 to 2000).map(_ => m) // List(Map(a -> 1.0, b -> 267.0, c -> 26.0, ...

  val r =   l2.map(_ + ("z" -> 2))
  println(s"${r.length} maps of ${r.head.size} took ${System.currentTimeMillis() - start} ms")

此打印: 2000张1001张地图用了5毫秒