如何从csv字符串中获取地图

Thi*_*man 6 csv string split scala map

我对Scala很新,但我现在正在练习.
我有一个字符串

"A>Augsburg;B>Berlin"
.我最终想要的是一张地图

val mymap = Map("A"->"Augsburg", "B"->"Berlin")

我做的是:

val st = locations.split(";").map(dynamicListExtract _)
与功能
private def dynamicListExtract(input: String)  = {
    if (input contains ">") {
      val split = input split ">"
      Some(split(0), split(1)) // return key , value
    } else {
      None 
    } 
  }
现在我有了
Array[Option[(String, String)
如何将其优雅地转换为Map [String,String]

有人可以帮忙吗?谢谢

Ran*_*ulz 11

只需将您的map电话改为flatMap:

scala> sPairs.split(";").flatMap(dynamicListExtract _)
res1: Array[(java.lang.String, java.lang.String)] = Array((A,Augsburg), (B,Berlin))

scala> Map(sPairs.split(";").flatMap(dynamicListExtract _): _*)
res2: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((A,Augsburg), (B,Berlin))
Run Code Online (Sandbox Code Playgroud)

为了比较:

scala> Map("A" -> "Augsburg", "B" -> "Berlin")
res3: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((A,Augsburg), (B,Berlin))
Run Code Online (Sandbox Code Playgroud)


Ben*_*ngs 9

在2.8中,您可以这样做:

val locations = "A>Augsburg;B>Berlin"
val result = locations.split(";").map(_ split ">") collect { case Array(k, v) => (k, v) } toMap
Run Code Online (Sandbox Code Playgroud)

collect是,map但也过滤未在部分函数中定义的值. toMap将创建一个MapTraversable,只要它是一个Traversable[(K, V)].