Scala:以纯函数式风格统计字符串中特定字符出现次数
纯函数式实现特定字符统计的修正方案
嗨,我来帮你搞定这个纯函数式统计字符的问题~ 先看看你写的代码哪里出问题了:
你的foldLeft写法有两个关键错误:
- 你把
(x,_)作为匹配对象,然后用case k if(k == 'h')来判断,但这里的k其实是元组(x,_),元组和字符'h'根本没法比较,所以这个条件永远不成立; - 你只处理了匹配的情况,没有处理不匹配的分支,运行时会抛出
MatchError。
下面给你两种正确的纯函数式实现方式:
方式一:用if-else简化实现
这是最直观的纯函数式写法,直接在foldLeft的函数参数里判断字符:
// 统计字符串中'H'的数量 val count1 = "HelloWorldHHHH".foldLeft(0) { (acc, char) => if (char == 'H') acc + 1 else acc } println(count1) // 输出:5
方式二:用模式匹配实现
如果你想用模式匹配来写,应该针对当前字符做匹配,同时要覆盖所有情况:
val count1 = "HelloWorldHHHH".foldLeft(0) { (acc, char) => char match { case 'H' => acc + 1 case _ => acc // 处理所有非'H'的情况 } } println(count1) // 输出:5
另外补充一句:你之前提到的"HelloWorldHHHH".count(_ == 'H')其实已经是纯函数式实现啦!count方法是纯函数(相同输入一定会得到相同输出,没有任何副作用),完全符合纯函数式的要求。
最后提醒下:注意字符的大小写哦,比如你例子里的"Hello"里的是小写'h',如果要统计它的话,记得把判断条件改成char == 'h'~
内容的提问来源于stack exchange,提问作者F0cus
相关产品推荐
相关产品推荐

