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

Dan*_*Dan 15 scala list 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)
} 
Run Code Online (Sandbox Code Playgroud)

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

Tra*_*own 13

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

list match {
  case l @ (_ :: _ :: _ :: _) => other(l)
  case l => op(l)
}
Run Code Online (Sandbox Code Playgroud)

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

  • @DenisR .:首先,我正在按要求回答问题,其次,我不确定在处理列表时,该回答实际上比保护条件要少,因为“长度”是一项昂贵的操作。如果要避免遍历列表(应该这样做),则必须编写“ case l if l.lengthCompare(3)> -1”这样的语句,这有点尴尬。 (2认同)

Fyn*_*ynn 11

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

list match {
    case l if(l.size <= 3) => op(l)
    case l => other(l)
}
Run Code Online (Sandbox Code Playgroud)

  • 使用lengthCompare可以更有效地将列表长度与3进行比较 (2认同)

Ran*_*ulz 6

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

if (list.length >= minimumLength)
  longer(list)
else
  shorter(list)
Run Code Online (Sandbox Code Playgroud)

  • 好点子.在这种情况下,您可以使用`lengthCompare`. (5认同)