代码之家  ›  专栏  ›  技术社区  ›  Tarun Khaneja

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

  •  0
  • Tarun Khaneja  · 技术社区  · 6 年前

    我有一张地图清单,如下所示。

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

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

    假设key为“k”,value为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)))
    

    但这太费时了。。对于列表中的100k个元素,大约300ms

    1 回复  |  直到 6 年前
        1
  •  0
  •   pme    6 年前

    这应该足够快:

      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")
    

    这张照片: