根据Scala中的键模式将地图转换为新地图

时间:2014-08-21 03:09:12

标签: regex scala

给出一个地图来查找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中实现?

2 个答案:

答案 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