【问题标题】:How to get comma separated values from List of Maps in Scala?如何从 Scala 中的地图列表中获取逗号分隔值?
【发布时间】:2016-11-29 00:10:20
【问题描述】:

我有 List[Map [String, String]] 类型的 listMap1 变量,我希望与键 'k1' 关联的所有值都作为一个带有逗号分隔值的字符串

import fiddle.Fiddle, Fiddle.println
import scalajs.js

@js.annotation.JSExport
object ScalaFiddle {

  var m1:Map[String,String] = Map(("k1"->"v1"), ("k2"->"vv1")) 
  var m2:Map[String,String] = Map(("k1"->"v2"),("k2"->"vv2"))
  var m3:Map[String,String] = Map(("k1"->"v3"),("k2"->"vv3"))

  var listMap1 = List(m1,m2,m3)
  var valList = ??  // need all values assoicated with k1 like -->  v1,v2,v3...
}

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    一个简单的方法是:

    listMap1.flatMap(_.get("k1")).mkString(",")
    

    请注意,如果您正在生成 CSV 数据并且相关值包含 ,s,则这将不起作用。 Map(("k1" -> "\some, string"))

    【讨论】:

    • @Pavel - 我猜flatMap 更快,因为它只需要一个键查找并且只创建一个中间列表而不是两个。
    • 还有旧的备用列表以获得更好的性能,完全避免任何中间列表:listMap1.iterator.flatMap(_.get("k1").iterator).mkString(",")。
    【解决方案2】:

    这样好吗??

      val r = listMap1.filter(l => l.contains("k1") ).map(r => r("k1") ).mkString(",")
    

    【讨论】:

    • 或者更短的形式_:listMap1.filter(_.contains("k1") ).map(_("k1") ).mkString(",")。
    • 强烈怀疑 flatMap 解决方案更快 :)) 过滤操作是额外的 O(n)?在这种特定情况下的努力。
    • 您始终可以使用视图来避免中间集合分配。
    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多