【问题标题】:Scala string pattern matching by multiple possible groups多个可能组的 Scala 字符串模式匹配
【发布时间】:2014-10-11 04:54:49
【问题描述】:

给定一个输入Map[String,String],例如

val in = Map("name1"                -> "description1",
             "name2.name22"         -> "description 22",
             "name3.name33.name333" -> "description 333")

什么是提取每个 name 和每个 description 并将它们输入到方法中的简单方法,例如

def process(description: String, name: String*): Unit = name match {
  case Seq(n)     =>  // find(n).set(description)
  case Seq(n,m)   =>  // find(n).find(m).set(description)
  case Seq(n,m,o) =>  // find(n).find(m).find(o).set(description)
  case _          =>  // possible error reporting
}

非常感谢

【问题讨论】:

  • 我猜您的意思是def process(tuple: (String, String)*)def process(description: String, name: String),因为您可以一个一个地处理每个条目,或者一次处理所有条目(这意味着不止一个 1 描述)。跨度>
  • @applicius 一次一个映射条目,键排列。
  • 返回类型是什么?
  • @applicius 有问题的注释更新 :)

标签: string scala pattern-matching scala-collections


【解决方案1】:

您可以使用 splat 运算符_*:

val in = Map("name1" -> "description1",
  "name2.name22" -> "description 22",
  "name3.name33.name333" -> "description 333")

def process(description: String, name: String*) = ???


in.map { x =>
  process(x._2, x._1.split("\\."): _*)
}

注意* 参数必须在函数签名的最后(否则编译器将无法决定在哪里停止)。

来自 REPL:

scala>   def process(description: String, name: String*) = {
     |     name.foreach(println)
     |     println(description)
     |   }
process: (description: String, name: String*)Unit

scala>   in.map { x =>
      |    process(x._2, x._1.split("\\."): _*)
      |   }
    name1
    description1
    name2
    name22
    description 22
    name3
    name33
    name333
    description 333

【讨论】:

    【解决方案2】:

    你可以这样做:

    in foreach { case (ns, d) => process(d, ns.split("\\."): _*) }
    

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多