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

摩尔斯码转英文:连续双空格识别与空格添加问题求助

摩尔斯码转英文的空格处理问题

问题描述

我正在开发摩尔斯码转英文的程序,现在卡在空格处理环节:摩尔斯码规则是单个空格分隔字母,连续两个空格代表英文空格,但用单个空格分割字符串数组时,无法识别连续双空格,导致转换后的英文没有正确的空格分隔。

当前代码

public static void main(String[] args) throws IOException {
    InputStreamReader reader = new InputStreamReader(System.in, StandardCharsets.UTF_8);
    BufferedReader in = new BufferedReader(reader);

    String line;
    String newMorse = "";
    String selectedMorse;
    String convertedMorse;

    int x = 0;

    while ((line = in.readLine()) != null) {
        String[] morseChars = line.split(" ");

        for (int i = 0; i < morseChars.length; i++) {
            selectedMorse = morseChars[i];
            convertedMorse = decode(selectedMorse);
            newMorse = newMorse + convertedMorse;
        }
        System.out.println(newMorse);
    }
}

示例

  • 输入:.- ...- ..--- .-- .... .. . -.-. -..- ....- .....(注意中间的双空格)
  • 预期输出:AV2WHIECX 45

解决方案

核心问题是split(" ")会忽略连续空格产生的空字符串,导致无法判断双空格的存在。以下两种方法可以解决:

方法1:保留分割后的空字符串

使用split(" ", -1)重载方法,它会保留分割产生的所有空字符串(包括连续空格带来的空元素)。遍历数组时判断元素是否为空:

  • 空字符串代表双空格,直接添加英文空格;
  • 非空元素则正常解码拼接。

修改后的代码:

public static void main(String[] args) throws IOException {
    InputStreamReader reader = new InputStreamReader(System.in, StandardCharsets.UTF_8);
    BufferedReader in = new BufferedReader(reader);

    String line;
    // 用StringBuilder提升拼接效率,避免频繁创建字符串对象
    StringBuilder newMorse = new StringBuilder();
    String selectedMorse;
    String convertedMorse;

    while ((line = in.readLine()) != null) {
        // 保留所有分割结果,包括空字符串
        String[] morseChars = line.split(" ", -1);

        for (int i = 0; i < morseChars.length; i++) {
            selectedMorse = morseChars[i];
            if (selectedMorse.isEmpty()) {
                newMorse.append(" ");
            } else {
                convertedMorse = decode(selectedMorse);
                newMorse.append(convertedMorse);
            }
        }
        System.out.println(newMorse);
        // 处理完一行后清空,避免下一行内容混淆
        newMorse.setLength(0);
    }
}

方法2:先替换双空格为特殊标记

先把输入中的连续双空格替换成一个特殊标记(比如|),再用单个空格分割,遍历遇到标记时添加英文空格:

public static void main(String[] args) throws IOException {
    InputStreamReader reader = new InputStreamReader(System.in, StandardCharsets.UTF_8);
    BufferedReader in = new BufferedReader(reader);

    String line;
    StringBuilder newMorse = new StringBuilder();
    String selectedMorse;
    String convertedMorse;

    while ((line = in.readLine()) != null) {
        // 把双空格替换为特殊标记
        String processedLine = line.replace("  ", " | ");
        String[] morseChars = processedLine.split(" ");

        for (int i = 0; i < morseChars.length; i++) {
            selectedMorse = morseChars[i];
            if ("|".equals(selectedMorse)) {
                newMorse.append(" ");
            } else {
                convertedMorse = decode(selectedMorse);
                newMorse.append(convertedMorse);
            }
        }
        System.out.println(newMorse);
        newMorse.setLength(0);
    }
}

额外优化建议

  • 用StringBuilder代替直接字符串拼接(newMorse = newMorse + convertedMorse),大幅提升性能;
  • 处理完每行后清空StringBuilder,防止跨内容拼接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:25:33