解码莫尔斯电码时出现错误

时间:2018-08-31 14:19:22

标签: java string morse-code

我正在尝试将给定的莫尔斯语翻译成英语。但是,我在编写的代码中遇到了一个错误。这是我的代码:

String code=".... . -.--   .--- ..- -.. ."; //Decodes to "HEY JUDE"
String[] letters = code.split(" ");
StringBuilder res = new StringBuilder();
for(String str : letters){
    if(!str.equals(""))
        res.append(MorseCode.get(str));
    else res.append(" ");
}
System.out.println(res);

在第7行,如果我写:

res.append(" ");

输出为:

  

HEY犹大人

如果我写:

res.append("");

输出为:

  

HEYJUDE

3 个答案:

答案 0 :(得分:2)

围绕空格分割的三个连续空格将为您提供两个空字符串(第一个和第二个连续空格之间的空字符串以及第二个和第三个连续空格之间的空字符串)。

您要么需要更改消息空间的编码方式,要么需要处理这两个连续的空字符串。假设您无法更改邮件的编码,并且空格总是单独出现(字母分隔符)或三个(编码后的空格),那么以下方法将起作用:

String code=".... . -.--   .--- ..- -.. ."; //Decodes to "HEY JUDE"
Iterator<String> letters = Arrays.asList(code.split(" ")).iterator();
StringBuilder res = new StringBuilder();
while(letters.hasNext()) {
    String current = letters.next();
    if (! "".equals(current)) { // we have a letter
        res.append(MorseCode.get(current));
    } else { // we have an empty string, the first of two which represent a space
        res.append(" ");
        letters.next(); // we skip the next item which will be an empty string
    }
}
System.out.println(res);

您可以try it here(由于我没有您的MorseCode类,因此字母用x表示。)

答案 1 :(得分:2)

我不确定为什么您只尝试一个循环来解决这个问题。

是更简单,更易读的解决方案
  1. 在3个空格上分割code,以获得所有单独编码的“单词”,例如".... . -.--"".--- ..- -.. ."
  2. 在1个空格处分割每个编码的“单词”,以获得单个摩尔斯电码序列".... . -.--"-> "...." "." "-.--"

那么您可以

  • 将莫尔斯电码转换为字母
  • 将解码后的字母组合成单词
  • 将单词连成句子(用空格隔开)。

所以您的代码看起来像

StringJoiner sentence = new StringJoiner(" ");    // decoded words should be 
                                                  // separated with single space
for (String section : code.split("   ")){ 
    StringBuilder word = new StringBuilder();
    for(String morse : section.split(" ")){
        word.append(MorseCode.get(morse));
    }
    sentence.add(word.toString());
}

String result = sentence.toString();

如果您不喜欢在每次迭代(对于每个单词)中重新创建StringBuilder,则可以创建一个before循环,并在每次迭代开始时使用setLength(0)将其重置。

答案 2 :(得分:1)

如果您使用Map<String, String>作为字典,则可以执行以下操作。将null的值替换为' ',并跟踪循环中之前打印的char,以便仅打印一个空格字符。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MorseCode {

    static Map<String, Character> morseDictionary;

    public static void main(String[] args) {
        morseDictionary = new HashMap<String, Character>();
        morseDictionary.put("....", 'H');
        morseDictionary.put(".", 'E');
        morseDictionary.put("-.--", 'Y');
        morseDictionary.put(".---", 'J');
        morseDictionary.put("..-", 'U');
        morseDictionary.put("-..", 'D');

        String morseCode = ".... . -.--   .--- ..- -.. .";
        printTranslationOf(morseCode);
    }

    public static void printTranslationOf(String morseCode) {

        String[] singleCharacters = morseCode.split(" ");

        List<Character> latinCharacters = new ArrayList<Character>();

        char lastChar = ' ';
        for (String character : singleCharacters) {
            char printable = morseDictionary.get(character) == null ?
                    ' ' : morseDictionary.get(character);

            if (printable == ' ') {
                if (lastChar != ' ') {
                    latinCharacters.add(printable);
                }
            } else {
                latinCharacters.add(printable);
            }

            lastChar = printable;
        }

        latinCharacters.forEach((Character character) -> {
            System.out.print(character);
        });
    }
}