模式匹配列表具有一定大小或更大/更小

时间:2013-04-17 02:24:08

标签: list scala pattern-matching

有没有办法在Scala中指定与大小更大(或更小)或等于某个值的List匹配的模式?

例如,如果我想对3个或更小的所有列表应用相同的操作:

list match {
    case Nil => op(list) 
    case x :: Nil => op(list)
    case x :: y :: Nil => op(list)
    case x :: y :: z :: Nil => op(list)
    case x :: tail => other(list)
} 

有没有办法将此减少到两个案例?

4 个答案:

答案 0 :(得分:13)

是的,虽然您需要撤消案件的顺序:

list match {
  case l @ (_ :: _ :: _ :: _) => other(l)
  case l => op(l)
}

请注意,我已将新变量l绑定到模式中的列表而不是引用list,并且我在不需要时使用_一个变量。我建议坚持这两种做法,但如果没有它们,答案就会完全相同。

答案 1 :(得分:11)

如果你坚持使用模式匹配(也许你想要包含更多匹配案例?),你可以使用保护条件

list match {
    case l if(l.size <= 3) => op(l)
    case l => other(l)
}

答案 2 :(得分:6)

普通的旧if / else ??

出了什么问题
if (list.length >= minimumLength)
  longer(list)
else
  shorter(list)

答案 3 :(得分:4)

你也可以这样做:

list.splitAt(len) match {
   case (xs, Nil) => other(xs)
   case (_, _) => op(list)
}

此外,复杂性为O(len),因此即使列表长,len也是决定因素。

如果op或其他人调用list.size < len

,则上述调用other