基于前置字符的条件字符替换Java实现求助(电影脚本处理)
嘿,我来帮你搞定这个Java作业的问题!看起来你已经搭好了文件读取的基础框架,接下来咱们重点搞定convert方法的实现,还有完整的文本处理逻辑就行。
核心需求梳理
你的任务是遍历电影脚本的每一行,把**紧跟在元音字母(a、e、i、o、u,包含大小写)后面的'r'(无论大小写)**转换成对应的'h'/'H'。比如"Car"会变成"Cah","Fire"变成"Fih-e","ARt"变成"A Ht"。
1. 先完善convert方法的实现
这个方法需要知道前一个字符和当前字符,才能判断当前的'r'是否满足替换条件。咱们写个私有的工具方法就行:
private static char convert(char previousChar, char currentChar) { // 统一转成小写,方便判断元音,不用区分大小写 char lowerPrev = Character.toLowerCase(previousChar); char lowerCurr = Character.toLowerCase(currentChar); // 判断前一个字符是元音,且当前字符是r if ((lowerPrev == 'a' || lowerPrev == 'e' || lowerPrev == 'i' || lowerPrev == 'o' || lowerPrev == 'u') && lowerCurr == 'r') { // 保持原字符的大小写:原是大写R就返回H,否则返回h return Character.isUpperCase(currentChar) ? 'H' : 'h'; } // 不满足条件就返回原字符 return currentChar; }
2. 补全main方法的文本处理逻辑
现在你需要遍历每一行的每个字符,记录前一个字符,对每个当前字符调用convert方法。这里用StringBuilder来拼接处理后的字符,效率比直接字符串拼接高:
public static void main(String[] args) { // 这里替换成你的电影脚本文件路径,也可以改成从命令行参数传入 String scriptPath = "movie_script.txt"; // 用try-with-resources自动关闭Scanner,避免资源泄漏 try (Scanner fileScanner = new Scanner(new File(scriptPath))) { while (fileScanner.hasNextLine()) { String originalLine = fileScanner.nextLine(); StringBuilder processedLine = new StringBuilder(); if (originalLine.length() == 0) { // 空行直接保留 processedLine.append(originalLine); } else { // 第一个字符没有前导字符,直接加入 processedLine.append(originalLine.charAt(0)); // 从第二个字符开始遍历处理 for (int i = 1; i < originalLine.length(); i++) { char prevChar = originalLine.charAt(i - 1); char currChar = originalLine.charAt(i); processedLine.append(convert(prevChar, currChar)); } } // 可以选择输出到控制台,或者写入新文件 System.out.println(processedLine); // 如果要写入文件,这里可以加FileWriter的逻辑,比如: // try (FileWriter writer = new FileWriter("processed_script.txt", true)) { // writer.write(processedLine + System.lineSeparator()); // } catch (IOException e) { // e.printStackTrace(); // } } } catch (FileNotFoundException e) { System.err.println("找不到指定的脚本文件:" + scriptPath); e.printStackTrace(); } }
3. 几个需要注意的细节
- 大小写兼容:上面的代码已经处理了大小写元音和大小写R,如果你只需要处理小写场景,可以去掉
Character.toLowerCase和Character.isUpperCase的判断。 - 边界情况:比如行首的'r'(没有前导元音,不会替换)、连续的'r'(比如"aar"会变成"ahr",第二个r的前导是h,不是元音,所以保留)。
- 异常处理:用try-with-resources处理Scanner和FileWriter,确保资源自动关闭,避免IO泄漏。
- 扩展灵活性:如果之后要加其他转换规则,直接修改
convert方法的判断逻辑就行,不用动主流程。
内容的提问来源于stack exchange,提问作者Matt Shade
相关产品推荐
相关产品推荐

