如何将List(List [String])转换为Map [String,Int]?

时间:2012-04-08 11:22:49

标签: list scala map

我有List(List("aba, 4"), List("baa, 2")),我想将其转换为地图:

val map : Map[String, Int] = Map("aba" -> 4, "baa" -> 2)

归档此内容的最佳方式是什么?

更新:

我做一个数据库查询来检索数据:     val(_,myData)= DB.runQuery(...)

这会返回一对,但我只对第二部分感兴趣,它给了我:

myData: List[List[String]] = List(List(Hello, 19), List(World, 14), List(Foo, 13), List(Bar, 13), List(Bar, 12), List(Baz, 12), List(Baz, 11), ...)

4 个答案:

答案 0 :(得分:8)

scala> val pat = """\((.*),\s*(.*)\)""".r
pat: scala.util.matching.Regex = \((.*),\s*(.*)\)

scala> list.flatten.map{case pat(k, v) => k -> v.toInt }.toMap
res1: scala.collection.immutable.Map[String,Int] = Map(aba -> 4, baa -> 2)

答案 1 :(得分:4)

还有另一种看法:

List(List("aba, 4"), List("baa, 2")).
  flatten.par.collect(
    _.split(",").toList match {
      case k :: v :: Nil => (k, v.trim.toInt) 
  }).toMap

与其他答案的区别:

  • 使用.par来并行创建对,这样我们就可以从多个核心中获利。
  • 使用collectPartialFunction来忽略不属于“key,value”形式的字符串

编辑:.parnot destroy the order作为之前的回答状态。只能保证列表处理的执行顺序,因此功能应该是无副作用的(或者副作用不应该关心排序)。

答案 2 :(得分:1)

我的看法:

List(List("aba, 4"), List("baa, 2")) map {_.head} map {itemList => itemList split ",\\s*"} map {itemArr => (itemArr(0), itemArr(1).toInt)} toMap

分步骤:

List(List("aba, 4"), List("baa, 2")).
  map(_.head).                                    //List("aba, 4", "baa, 2")
  map(itemList => itemList split ",\\s*").        //List(Array("aba", "4"), Array("baa", "2"))
  map(itemArr => (itemArr(0), itemArr(1).toInt)). //List(("aba", 4), ("baa", 2))
  toMap                                           //Map("aba" -> 4, "baa" -> 2)

您的输入数据结构有点尴尬,所以我认为您不能对其进行优化/缩短它。

答案 3 :(得分:1)

List(List("aba, 4"), List("baa, 2")).
  flatten.     //get rid of those weird inner Lists
  map {s=> 
    //split into key and value
    //Array extractor guarantees we get exactly 2 matches
    val Array(k,v) = s.split(","); 
    //make a tuple out of the splits
    (k, v.trim.toInt)}.
  toMap  // turns an collection of tuples into a map