使用Scala模式匹配来查找List是否包含值

时间:2014-05-29 20:51:32

标签: scala pattern-matching match

我已经看过你可以使用模式匹配对List进行一系列不同的匹配。是否可以使用模式匹配来识别列表中的任何(理想情况下)元素是否包含值x?所以像这样:

def contains(text: List[Char], chr: Char): Boolean = text match{
  case *pattern matching chr to any value in text* => true
  case _ => false
}

只是想了解它能做什么,不能做什么。

(我知道我可以使用text.contains(chr),BTW)

谢谢, 彼得

2 个答案:

答案 0 :(得分:1)

我所看到的是使用列表上的匹配来递归,在你的情况下可能是这样的:

def contains(text: List[Char], chr: Char): Boolean = text match{
  case head :: tail  => head.equals(chr) || contains(tail, chr)
  case Nil => false
}

我认为你不能使用匹配来执行这种操作,因为列表的unapply方法是如何定义的,理论上如果你知道列表的长度你可以编写像

case x1 :: x2 :: x3 // and so on

但我想你可以自己看出这对于参数匹配来说不实用也不理想。

答案 1 :(得分:1)

不确定您是否正在寻找,但您可以将if表达式放在模式匹配中。

此代码看似人为,但它演示了如何将contains或其他随机函数放入模式匹配中。

scala> def contains(text: List[Char], chr: Char): Boolean = text match{
     |     case _ if text.contains(chr) => true
     |     case _ => false
     | }
contains: (text: List[Char], chr: Char)Boolean

scala> contains(List('a', 'b', 'c'), 'd')
res2: Boolean = false

scala> contains(List('a', 'b', 'c'), 'c')
res3: Boolean = true