20

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

例如,如果我想对所有大小为 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

4 回答 4

14

是的,尽管您需要颠倒案件的顺序:

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

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

于 2013-04-17T02:52:56.517 回答
13

如果您坚持使用模式匹配(也许您想包含更多匹配情况?),您可以为其使用保护条件

list match {
    case l if(l.size <= 3) => op(l)
    case l => other(l)
}
于 2013-04-17T08:24:59.160 回答
6

一个普通的旧 if / else 有什么问题?

if (list.length >= minimumLength)
  longer(list)
else
  shorter(list)
于 2013-04-17T03:14:25.023 回答
4

你也可以这样做:

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

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

上述调用opif list.size < lenelse 调用other

于 2013-04-17T06:41:18.307 回答