我想将摩尔斯电码翻译成文字。还有一个小问题

I want to translate morse code into words. Still have a small problem

所以我在“ ”分裂。问题是莫尔斯码将每个单词除以三个 space。 ” “。

所以当我翻译时,它总是打印出每个写在一起的单词,中间没有 spaces。

这是我的。我使用 StringBuilder 的原因很明显。

public class MorseCodeDecoder {
public static String decode(String morseCode) {
    String word = "";
    String character = "";

    //count how much space is inbetween lines.
    StringBuilder codeTwo = new StringBuilder();
    String[] output = morseCode.split(" ");


    for (int i = 0; i < output.length; i++) {

在这里我尝试做一个单独的 if 语句。如果 morseCode 包含三个 space 背对背追加一个 space.

//if(morseCode.contains("   ")) codeTwo.append(" "); (or \s maybe, doesnt matter)


        switch (output[i]) {
            case "   ":
                codeTwo.append(" ");
                break;
            case ".-":
                codeTwo.append("A");
                break;
            case "-...":
                codeTwo.append("B");
                break;
            case "-.-.":
                codeTwo.append("C");
                break;
            case "-..":
                codeTwo.append("D");
                break;
            case ".":
                codeTwo.append("E");
                break;
            case "..-.":
                codeTwo.append("F");
                break;
            case "--.":
                codeTwo.append("G");
                break;
            case "....":
                codeTwo.append("H");
                break;
            case "..":
                codeTwo.append("I");
                break;
            case ".---":
                codeTwo.append("J");
                break;
            case "-.-":
                codeTwo.append("K");
                break;
            case ".-..":
                codeTwo.append("L");
                break;
            case "--":
                codeTwo.append("M");
                break;
            case "-.":
                codeTwo.append("N");
                break;
            case "---":
                codeTwo.append("O");
                break;
            case ".--.":
                codeTwo.append("P");
                break;
            case "--.-":
                codeTwo.append("Q");
                break;
            case ".-.":
                codeTwo.append("R");
                break;
            case "...":
                codeTwo.append("S");
                break;
            case "-":
                codeTwo.append("T");
                break;
            case "..-":
                codeTwo.append("U");
                break;
            case "...-":
                codeTwo.append("V");
                break;
            case ".--":
                codeTwo.append("W");
                break;
            case "-..-":
                codeTwo.append("X");
                break;
            case "-.--":
                codeTwo.append("Y");
                break;
            case "--..":
                codeTwo.append("Z");
                break;
        }
    }
    return codeTwo.toString();
  }
 }

对于输入:.... . -.-- .--- ..- -.. 预期输出:"HEY JUDE"

您可以使用正则表达式而不是按空格分隔... 像这样的图案:

([._])+\s*

说明:我们正在寻找至少 1 个点 (.) 或下划线 (_) 后跟零个或多个空格的实例...

我在这个例子中使用了它:

._ _... _._   .._ ..._ .__

即:ABC UVW

我不在电脑附近 - 但程序应该看起来像这样:

public static String decode(final String morseCode) {
    final Matcher matcher = pattern.matcher(morseCode);

    final StringBuilder builder = new StringBuilder();
    while(matcher.find()) {
        builder.append(getLetter(matcher.group().trim()));
    }

    return builder.toString();
}

假设 getLetter() 是你的开关盒。

更吹毛求疵 - 与其使用这种巨大的开关盒,不如使用静态映射,其中包含符号和字母之间的映射,并在静态构造函数 (https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html) 上对其进行初始化

希望对您有所帮助。

你的问题是,因为你的字母和你的单词共享一个分隔符,当你被一个 space 分割时,你实际上完全删除了你的单词间距,所以 switch 语句永远没有机会读取他们。我可以想到两种解决方案。第一个是我下面的代码。由于摩尔斯电码只使用一组特定的字符,您可以简单地将单词分隔符替换为字母表之外的字符,然后检测它。对于第二种可能的解决方案,如果你想保持输入的完整性,那么你也可以先用三个 space 分割来分隔每个单词,然后在每个单词上使用你的 switch 语句,附加一个space 每个单词都被成功翻译后。这将需要两个循环(单词的外循环和字母的内循环)。

public class MorseCodeDecoder {
    public static String decode(String morseCode) {
        String word = "";
        String character = "";

        //count how much space is inbetween lines.
        StringBuilder codeTwo = new StringBuilder();
        morseCode.replace("   ", "|");
        String[] output = morseCode.split(" ");


        for (int i = 0; i < output.length; i++) {
            switch (output[i]) {
                case "|":
                    codeTwo.append(" ");
                    break;
                case ".-":
                    codeTwo.append("A");
                    break;
                //etc.
        }
        return codeTwo.toString();
    }
}