scala / recursion中的模式匹配

时间:2015-06-25 19:43:09

标签: function scala design-patterns recursion matching

我想实现一个计算直接跟随的相同字符数的函数。此功能始终只在头部开始。

(('b',0), List('b','b','x','x')) => (('b', 2), List('x', 'x'))

e.g。 def function: ((Char, Int), List[Char]) => ((Char, Int), List[Char])={ case(('a', b), Nil) => (('a',b), Nil) case(('a', b), t::xs) => (('a', b), t::xs) case (('a', b), a::xs) => function(('a', b+1),xs) }

case (('**a**', b), **a**::xs) => function(('a', b+1),xs)

我无法在模式匹配中发现错误。

行中的两个字符

{{1}}

同样(例如' a' ==' a'),当我给他们相同的角色时?

谢谢!

2 个答案:

答案 0 :(得分:3)

我认为这可以满足您的需求:

def function: ((Char, Int), List[Char]) => ((Char, Int), List[Char]) = {
  case ((a, b), Nil) => ((a,b), Nil)
  case ((a, b), c::xs) if a == c => function((a, b+1),xs)
  case other  => other
}

输出:

scala> function(('a', 0), "aaaabbbcc".toList)
res0: ((Char, Int), List[Char]) = ((a,4),List(b, b, b, c, c))

更简单的可能是:

def countChar(char: Char, list: List[Char]) : ((Char, Int), List[Char]) = {
  val equalChars = list.takeWhile(_ == char)
  val n = equalChars.length
  ((char, n), list.drop(n))
}

答案 1 :(得分:1)

这两种情况做同样的事情:

case (('a', b), t::xs) => ...
case (('a', b), a::xs) => ...

它们匹配元组的'a',将元组的第二部分分配给b,将集合的头部分配给变量(t,在第一种情况下{{1在第二个中)并将集合的其余部分分配给a

可能不是你的想法。