Kotlin:如何用函数式风格检查等长字符串字符差异恰好为1个?
函数式单行实现方案
可以利用zip将两个字符串的字符一一配对,再结合fold实现带提前终止逻辑的累加,最终写成单行函数:
fun diff(l: String, r: String): Int = l.zip(r).fold(0) { acc, (a, b) -> if (acc > 1) acc else acc + if (a != b) 1 else 0 }
逻辑说明
l.zip(r):把两个字符串的对应字符打包成Pair<Char, Char>序列;fold(0):以0为初始累加值遍历每个字符对;- 累加逻辑:如果当前差异数已超过1,直接返回当前累加值(和原代码的
break逻辑一致,提前终止后续无意义计算);否则判断字符是否不同,不同则累加1。
原代码的改进建议
增加参数合法性校验
原代码依赖输入字符串长度相同的前提,但如果调用时传入长度不同的字符串,会抛出ArrayIndexOutOfBoundsException。建议在函数开头添加校验:require(l.length == r.length) { "Input strings must have the same length" }优化循环写法
用Kotlin惯用的indices属性替代0 until l.length,代码更简洁易读:for (i in l.indices) { ... }语义化函数命名
原函数名diff比较模糊,结合实际用途(判断是否仅有一个字符差异),可以命名为hasSingleCharDiff(若返回布尔值)或者countCharDiffUpToTwo,让函数意图更清晰。
内容的提问来源于stack exchange,提问作者Alexander Ites
相关产品推荐
相关产品推荐

