You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala基于列表递归模式匹配实现文件驱动字符串替换问题

实现Scala的replLines字符串替换函数

首先先把我们已经有的基础函数摆出来,这些是用来读取文件并生成替换映射的:

import scala.io.Source

def readLines(x: String): List[String] = Source.fromFile(x).getLines.toList
def toKVMap(fName : String): Map[String,String] = readLines(fName).map(x => x.split(',')).map { case Array(x, y) => (x, y) }.toMap

接下来看需求:我们需要写一个replLines函数,它接收一个输入字符串和一个替换文件列表,要把输入字符串里的指定子串(来自替换文件的键)替换成对应的值,而且要按列表顺序依次应用每个文件的替换规则。比如你举的例子,输入"Hello"加上List("cat"),cat文件里是ello,i!,最终要返回Hi!——这个逻辑就是把"Hello"里的"ello"替换成"i!"对吧?

你已经用递归模式匹配搭好了框架,我来帮你把它补全:

def replLines(inpQ : String, y : List[String]): String = y match {
  // 递归终止:没有更多替换文件了,直接返回当前字符串
  case Nil => inpQ
  // 递归处理:先拿第一个文件做替换,再处理剩下的文件
  case head :: tail =>
    // 先把当前文件转成键值对映射
    val replacementMap = toKVMap(head)
    // 用foldLeft把所有替换规则应用到当前字符串上
    val afterReplacement = replacementMap.foldLeft(inpQ) { (current, kv) =>
      val (targetStr, newStr) = kv
      current.replace(targetStr, newStr)
    }
    // 把替换后的字符串传入下一轮递归,处理剩余文件
    replLines(afterReplacement, tail)
}

代码逻辑拆解

  • 递归终止条件:当替换文件列表是空的(case Nil),说明所有替换规则都用完了,直接返回当前的字符串就行。
  • 处理单个文件:每次从列表里拿出第一个文件,用toKVMap把它转成键值对——键是要找的子串,值是替换后的内容。
  • 应用替换规则:用foldLeft遍历这个映射,从初始字符串开始,依次把每个键对应的子串替换成值。这样不管文件里有多少组替换规则,都能一次性应用完。
  • 递归递进:把替换后的字符串作为新的输入,继续调用replLines处理剩下的文件列表,这样就能按顺序应用所有文件的替换规则了。

验证示例场景

当调用replLines("Hello", List("cat"))时:

  1. 先处理cat文件,生成Map("ello" -> "i!")
  2. 把"Hello"里的"ello"替换成"i!",得到"Hi!"
  3. 剩下的文件列表是空的,直接返回"Hi!",完全符合预期。

内容的提问来源于stack exchange,提问作者Carbon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:37:22