Scala 大量模式匹配案例列表
Scala large listing of cases in pattern matching
对于在有限域内 return 一个值的一长串案例,如何减少案例声明的数量?例如考虑
"abc" match {
case "a" => 1
case "ab" => 1
case "aw" => 2
case "hs" => 2
case "abc" => 1
case _ => 0
}
尝试了 Map[Set[String],Int]
其中
val matches = Map( Set("a","ab","abc") -> 1, Set("aw","hs") -> 2 )
并定义
def getMatch(key: String, m: Map[Set[String],Int]) = {
val res = m.keys.collectFirst{ case s if s(key) => m(s) }
res.getOrElse(0)
}
是否有更简单 and/or 更有效的方法?
您可以通过这样做稍微改变复杂性:
val m = matches.flatMap { case (xs,i) => xs.map(_ -> i) }.withDefaultValue(0)
m("abc") // 1
m("z") // 0
从而避免需要通过 getMatch 函数进行调用。也可能更快,因为您提前完成了工作,而不是每次需要调用 getMatch 时都遍历键。
您可以像这样创建自己的匹配器:
class InSet[T](set: Set[T]) {
def unapply(t: T) = set.find(t)
}
val set1 = new InSet(Set("a","ab","abc"))
val set2 = new InSet(Set("aw","hs"))
"aw" match {
case set1(a) => "1, " + a
case set2(a) => "2, " + a
case _ => "3"
}
这样做的好处是可以轻松创建和应用非常不同的匹配器。
您可以对案例进行分组:
"abc" match {
case "a" | "ab" | "abc" => 1
case "aw" | "hs" => 2
case _ => 0
}
对于在有限域内 return 一个值的一长串案例,如何减少案例声明的数量?例如考虑
"abc" match {
case "a" => 1
case "ab" => 1
case "aw" => 2
case "hs" => 2
case "abc" => 1
case _ => 0
}
尝试了 Map[Set[String],Int]
其中
val matches = Map( Set("a","ab","abc") -> 1, Set("aw","hs") -> 2 )
并定义
def getMatch(key: String, m: Map[Set[String],Int]) = {
val res = m.keys.collectFirst{ case s if s(key) => m(s) }
res.getOrElse(0)
}
是否有更简单 and/or 更有效的方法?
您可以通过这样做稍微改变复杂性:
val m = matches.flatMap { case (xs,i) => xs.map(_ -> i) }.withDefaultValue(0)
m("abc") // 1
m("z") // 0
从而避免需要通过 getMatch 函数进行调用。也可能更快,因为您提前完成了工作,而不是每次需要调用 getMatch 时都遍历键。
您可以像这样创建自己的匹配器:
class InSet[T](set: Set[T]) {
def unapply(t: T) = set.find(t)
}
val set1 = new InSet(Set("a","ab","abc"))
val set2 = new InSet(Set("aw","hs"))
"aw" match {
case set1(a) => "1, " + a
case set2(a) => "2, " + a
case _ => "3"
}
这样做的好处是可以轻松创建和应用非常不同的匹配器。
您可以对案例进行分组:
"abc" match {
case "a" | "ab" | "abc" => 1
case "aw" | "hs" => 2
case _ => 0
}