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

基于前置字符的条件字符替换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:49:47