【问题标题】:Transform a map into a new map based on the pattern of keys in Scala根据 Scala 中的键模式将映射转换为新映射
【发布时间】:2014-08-22 12:39:26
【问题描述】:

给定一个地图来查找 C{NUMBER} -> STRING 模式的元素;这是我的代码。

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 中实现?

【问题讨论】:

    标签: regex scala


    【解决方案1】:

    这里是:

    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)
    

    【讨论】:

      【解决方案2】:

      使用提供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)
      

      请注意导致None 的 for comprehension 扁平化(不成功)提取。

      对于与正则表达式一起使用的提取器的冗长介绍,请考虑http://www.artima.com/pins1ed/extractors.html

      【讨论】:

        猜你喜欢
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        • 2020-08-23
        • 2020-01-05
        • 2014-04-09
        相关资源
        最近更新 更多