【问题标题】:I want to translate morse code into words. Still have a small problem我想把莫尔斯电码翻译成文字。还有一个小问题
【发布时间】:2020-05-10 01:38:56
【问题描述】:

所以我在“”处分裂。问题是摩尔斯电码将每个单词除以三个空格。 “”。

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

这就是我所拥有的。我使用 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 语句。如果摩斯电码包含三个空格,则背靠背追加一个空格。

//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”

【问题讨论】:

  • 您能否提供一个预期的输入和预期的输出,以及您当前的输入和当前输出作为例子?
  • 为什么不将字符串中的所有三个空格替换为单个空格。此外,在你的 for 循环中,在 switch 部分之后,附加一个空格,以便结果将单词分开。

标签: java string loops switch-statement morse-code


【解决方案1】:

您可以使用正则表达式来代替空格分割... 像这样的模式:

([._])+\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) 上初始化它,而不是使用这个庞大的 switch case。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    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();
        }
    }
    

    【讨论】:

    • 请注意,字母由单个空格分隔,而单词由 3 个空格分隔
    • 所以从你的例子中去掉了多余的空格,因此造成了混乱。我现在明白了,等一下,我会更新解决方案。
    • 更新了更合适的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多