【问题标题】:pattern matching in scala / recursionscala/递归中的模式匹配
【发布时间】:2015-09-12 14:16:18
【问题描述】:

我想实现一个函数来计算紧随其后的相同字符的数量。此功能始终且仅从头部开始。

function((Char, Int), List[char]) => ((Char, Int), List[Char])

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

  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)

相同的(比如'a' == 'a'),当我给他们相同的字符时?

谢谢!

【问题讨论】:

  • 这是一种编程语言还是只是一些随机字符?只是问...
  • 这是 Scala 编程语言。现在你也知道了;)
  • 这是为了讽刺。我知道斯卡拉,我再也不会碰它了。
  • 哈哈,是的,有时候有点奇怪

标签: function scala design-patterns recursion matching


【解决方案1】:

我认为这是你想要的:

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))
}

【讨论】:

  • 字符不在开头时会发生什么?例如,function(('a', 0), "baaa".toList)。我认为从他的描述中不清楚他在这里想要什么。
  • 我的解决方案在这种情况下不起作用,是的。但是从“计算紧跟在后面的相同字符数”“总是只从头部开始”我推断它应该只计算开头的字符。
  • 你是对的。问题出在问题上,根本不清楚。我已经将其标记为“需要修订”。
【解决方案2】:

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

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

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

可能不是你的想法。

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 2011-03-03
    • 1970-01-01
    • 2014-09-22
    • 2018-12-15
    • 2012-01-06
    • 2017-01-26
    • 2012-10-31
    • 2016-05-17
    相关资源
    最近更新 更多