使用Scala中的子字符串统计字符串中特定字符的出现次数

使用Scala中的子字符串统计字符串中特定字符的出现次数,scala,Scala,我对编程很陌生。我被要求通过在scala中使用子字符串和递归来计算字符串中特定字符的出现次数。我完全迷路了,我不知道如何检查该字符串中第二个字符的相等性。我不应该使用递归和映射。非常感谢 到目前为止,我的代码如下所示: def countChars(str:String, chr:Char):Int = { if (str.length == 0) 0 else { if (chr == str.substring(0,1)) 1 else 0} + cou

我对编程很陌生。我被要求通过在scala中使用子字符串和递归来计算字符串中特定字符的出现次数。我完全迷路了,我不知道如何检查该字符串中第二个字符的相等性。我不应该使用递归和映射。非常感谢

到目前为止,我的代码如下所示:

def countChars(str:String, chr:Char):Int = {
    if (str.length == 0)  0
    else {
    if (chr == str.substring(0,1)) 1
    else 0}   + countChars()
}
println(countChars())

首先,这是一个工作版本(没有使用最短版本来使其更容易阅读):

你有两个问题。首先,您没有使用正确的参数调用countChars。更重要的是,可能不是很明显:您将字符与字符串进行了比较。这永远不会是真的:

chr == str.substring(0,1)
因为
=
equals
都首先检查类型,所以这是不同的。就像我做的那样,只需使用一个typecast,或者在本例中使用一个简单的
toString

希望这对你有帮助


编辑对不起,刚才不小心按下了post按钮。

首先,这是一个工作版本(没有使用最短的版本以便于阅读):

你有两个问题。首先,您没有使用正确的参数调用countChars。更重要的是,可能不是很明显:您将字符与字符串进行了比较。这永远不会是真的:

chr == str.substring(0,1)
因为
=
equals
都首先检查类型,所以这是不同的。只需使用一个类型转换,或者在这种情况下,像我一样使用一个简单的
toString

希望这对你有帮助


编辑抱歉,刚才不小心按下了post按钮。

惯用的scala解决方案是:

def countChars(str: String, chr: Char): Int = str.filter(_ == chr).length

我不知道您为什么要使用
map
,但您的问题并没有说不要使用
filter

惯用的scala解决方案是:

def countChars(str: String, chr: Char): Int = str.filter(_ == chr).length

我不知道你为什么要使用
map
,但你的问题没有说不要使用
filter

这里有一个解决方案,在每次迭代中使用第一个字符的存在/值匹配:

def countChars(str: String, chr: Char): Int = str.headOption match {
    case None => 0
    case Some(ch) if ch == chr => 1 + countChars(str.substring(1), chr)
    case _ => countChars(str.substring(1), chr) 
}

下面是一个解决方案,在每次迭代中使用第一个字符的存在/值匹配:

def countChars(str: String, chr: Char): Int = str.headOption match {
    case None => 0
    case Some(ch) if ch == chr => 1 + countChars(str.substring(1), chr)
    case _ => countChars(str.substring(1), chr) 
}

与@cokeSchlumpf和@Shadowlands答案不同

def countChars(s: String, c: Char): Int = {
  if (s.isEmpty) 0
  else if (s.substring(0,1).head == c) 1 + countChars(s.substring(1),c)
  else countChars(s.substring(1),c)
}

与@cokeSchlumpf和@Shadowlands答案不同

def countChars(s: String, c: Char): Int = {
  if (s.isEmpty) 0
  else if (s.substring(0,1).head == c) 1 + countChars(s.substring(1),c)
  else countChars(s.substring(1),c)
}

你应该使用递归,但不是尾部递归??你应该使用递归,但不是尾部递归??实际上,惯用的scala可能更像是
str.count(==chr)
“asdkfjvksjkdkjrw.count(=='j')
OP提到他实际上应该使用递归,惯用的scala可能更像
str.count(==chr)
中的“asdkfjvksjkdkjrw.count(==j')OP提到他应该使用递归,这正是我想要的!真棒的回答!谢谢@sytuacnh,如果这是你要找的答案,应该这样标记。这正是我要找的!真棒的回答!谢谢@sytuacnh,如果这是你要找的答案,应该标记为这样。