我有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), ...)
答案 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
来并行创建对,这样我们就可以从多个核心中获利。collect
和PartialFunction
来忽略不属于“key,value”形式的字符串编辑:.par
以not 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