给出一个地图来查找C {NUMBER}模式的元素 - >串;这是我的代码。
val pattern = "C([0-9]+)".r
// find the elements C[0-9]+ format
val plots = smap filter { x =>
x._1 match {
case pattern(r) => true
case _ => false
}
}
我需要使用模式提取元素,但要创建Map [Int,String]的新地图。例如:
Map[String, String]("C1"->"a", "B", "C2"->"c") => Map[Int](1 -> "a", 2 -> "c")
如何在Scala中实现?
答案 0 :(得分:5)
这是:
scala> val m = Map[String, String]("C1"->"a", "B" -> "M", "C2" -> "c")
m: scala.collection.immutable.Map[String,String] = Map(C1 -> a, B -> M, C2 -> c)
scala> val P = "C([0-9]+)".r
P: scala.util.matching.Regex = C([0-9]+)
scala> val n = m collect { case (P(i), v) => (i.toInt, v) }
n: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> c)
答案 1 :(得分:0)
使用提供Option[Int]
的提取器;即
object NumStr {
val re = "C(\\d+)".r
def unapply(s: String): Option[Int] = {
s match {
case re(v) => Some(v.toInt)
case _ => None
}
}
}
因此我们可以迭代
val a = Map[String, String]("C1" -> "a", "B" -> "M", "C2" -> "c")
提取键上的数值并创建一个新的地图,例如,
for ( (NumStr(k),v) <- a ) yield k -> v
res: Map[Int,String] = Map(1 -> a, 2 -> c)
注意for comprehension展平(不成功)提取导致None
。
对于与正则表达式一起使用的提取器的冗长介绍,请考虑http://www.artima.com/pins1ed/extractors.html。