首页 文章

如何将Map [String,Seq [String]]转换为Map [String,String]

提问于
浏览
4

我有一个Map [String,Seq [String]],并希望基本上将它转换为Map [String,String],因为我知道序列只有一个值 .

4 回答

  • 0

    你可以使用 mapValues() .

    scala> Map("a" -> Seq("aaa"), "b" -> Seq("bbb"))
    res0: scala.collection.immutable.Map[java.lang.String,Seq[java.lang.String]] = M
    ap(a -> List(aaa), b -> List(bbb))
    
    scala> res0.mapValues(_(0))
    res1: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(a
    -> aaa, b -> bbb)
    
  • 0

    我想通过以下方式得到了它:

    mymap.flatMap(x => Map(x._1 -> x._2.head))
    
  • 4

    还有一个建议:

    m mapValues { _.mkString }
    

    这个与Seq是否有多个元素无关 - 它只是将所有字符串连接在一起 . 如果您担心每个值的重新计算,您可以事先做到:

    (m mapValues { _.mkString }).view.force
    
  • 3

    其他人已经提到 mapValues ,但如果我是你,我会这样做:

    scala> val m = Map(1 -> Seq(1), 2 -> Seq(2))
    m: scala.collection.immutable.Map[Int,Seq[Int]] = Map(1 -> List(1), 2 -> List(2))
    
    scala> m.map { case (k,Seq(v)) => (k,v) }
    res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2)
    

    两个原因:

    • mapValues 方法生成结果Map的视图,这意味着每次访问元素时都会重新计算该函数 . 除非您计划一次访问每个元素,或者您只计划访问其中的一小部分元素,否则您不希望进行重新计算 .

    • 使用带有 (k,Seq(v)) 的大小写确保如果函数看到一个不包含一个元素的Seq,则会抛出异常 . 如果有零元素,使用 _(0)_.head 将抛出异常,但如果你有多个元素则不会抱怨,这可能会在以后丢失而没有错误时导致神秘的错误 .

相关问题