Scala 从字符串右侧查找指定Char索引的惯用实现方法
Scala 从字符串右侧查找指定字符索引的实现
需要实现的逻辑是:返回字符串中从右向左匹配到的第一个目标字符的正向索引,匹配失败返回-1。这类需求不需要从零手写遍历逻辑,Scala生态有成熟的实现路径,完全符合日常编码习惯。
方案1:原生方法直连(生产环境首选)
Scala的String类型直接映射java.lang.String的能力,而JDK内置的lastIndexOf(Char)方法本身就是从字符串末尾开始匹配字符、返回正向索引的实现,行为和给出的测试用例完全对齐。
函数实现:
def indexOfFromRight(s: String, c: Char): Int = s.lastIndexOf(c)
逐用例验证匹配度:
- 输入
"iii", 'i':最右侧字符的索引为2,和断言预期一致 - 输入
"abbabb", 'a':字符串中的两个'a'分别位于索引0和3,最右侧匹配位置为3,和断言预期一致 - 输入
"foobar", 'x':目标字符不存在,方法直接返回-1,和断言预期一致
这个实现是JVM层面的优化原生实现,遍历性能远高于手写循环、集合操作,同时自动覆盖空字符串、特殊字符等边界场景,不需要额外编写防御逻辑。
方案2:纯Scala集合实现(逻辑可定制)
如果需要脱离Java原生方法、保持纯Scala代码风格,可以借助字符串的集合特性实现:把字符串转换为带索引的字符序列,从右向左匹配目标字符。
Scala 2.13及以上版本可以直接使用collectLast实现:
def indexOfFromRight(s: String, c: Char): Int = s.zipWithIndex .collectLast { case (ch, idx) if ch == c => idx } .getOrElse(-1)
低版本Scala可以通过反转序列的方式兼容实现:
def indexOfFromRight(s: String, c: Char): Int = s.zipWithIndex .reverse .find(_._1 == c) .map(_._2) .getOrElse(-1)
这类实现的优势是逻辑完全透明,后续如果需要扩展匹配规则(比如忽略大小写、带条件匹配字符),只需要调整匹配判断逻辑即可,代码可读性强。
内容的提问来源于stack exchange,提问作者Ramón J Romero y Vigil
相关产品推荐
相关产品推荐

