我想实现一个计算直接跟随的相同字符数的函数。此功能始终只在头部开始。
(('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'),当我给他们相同的角色时?
谢谢!
答案 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
。
可能不是你的想法。