Java - 分裂莫尔斯,不承认单个莫尔斯角色

时间:2017-10-01 21:01:54

标签: java

我拔出我的头发...... 是的,它已经发布了所有并且没有,似乎无法绕过我的错误。我知道我正在努力处理字符和字符串的细微差别。但我的输出没有帮助,也许其他人可以?下面是我得到的输出和给我的代码。

输入:
...
没有输出

此输入
...... ---
输出
Ë
Ë
ë

和此输入

... | ---
输出
Ë
Ë
ë

只有第一个莫尔斯“字符”(应该是's'),忽略管道和/或空间后的休息

public static void morseToEnglish() {

    String englishArray[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
    String morseArray[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".--- ", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};

    //String translatedText = "";
    //String newEnglishChar;

    System.out.println("Enter Morse, separate each letter or digit with a single space, separate words with '|' ");
    Scanner input = new Scanner(System.in);

    String morseSentence = input.nextLine();

    String[] words = morseSentence.split("|");

    for (String word: words) {

    String[] morseChars = word.split(" ");

        for (String morseChar : morseChars) {

            if (morseChar.isEmpty()) { continue; }

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

                if (morseChar.equals(morseArray[i])) {

                    System.out.println(englishArray[i]);

                    //newEnglishChar = englishArray[i];
                    //translatedText = translatedText + newEnglishChar;
                }
            }
        }
    }
    //System.out.println(translatedText);
}

我没有收到任何编译错误。代码工作正常,我刚刚告诉它错误的指令,所以我的输出不是我喜欢的。在我看来,Scanner正在输入莫尔斯,例如, '...',并将其翻译成三个e而不是单个s。我曾尝试过例外(如果(!。包含))(或多或少),但它不起作用,似乎是过度的条件。 我觉得我只是没有以正确的方式对待正确的物体。真的,如果第二种情况(两个莫尔斯字符,用空格分隔)可以起作用,我会没事的。在这一点上,单个莫尔斯角色可能太多了。 一个大问题:我在哪里告诉Java,将三个点视为三个单独的字母是可以的?为什么?......我希望这有帮助。

2 个答案:

答案 0 :(得分:1)

您的代码有两个问题:

  • 由于|regex metacharacter,因此您需要使用例如morseSentence.split("[|]")
  • 来转义它
  • 您在内部循环中使用了错误的length:应该是morseArray.length而不是words.length

morseArray中的所有字符串都是唯一的,因此您可以在找到匹配项后在嵌套循环中设置break

Demo.

注意:您可以从关联容器中受益,无需循环(Map<K,V>)即可进行映射。

答案 1 :(得分:1)

您编写的代码存在几个问题。

  1. 数据结构选择不当,对于此用例,您最好使用Map,因为您要关联2个值。

  2. 你在正则表达式中使用的字符串不是好的,你需要逃避它

  3. 通过避免使用局部变量

  4. ,可以使代码更具可读性

    这是您想要的工作版本

    public static Map<String, String> init() {
        HashMap<String, String> map = new HashMap<>();
        map.put(".", "e");
        map.put("...", "h");
        //... All the other letters
        return map;
    }
    
    public static void main(String ... args) {
        Map<String, String> map = init();
        System.out.println("Enter Morse, separate each letter or digit with a single space, separate words with '|' ");
        Scanner input = new Scanner(System.in);
        String morseSentence = input.nextLine();
        for (String word: morseSentence.split("\\|")) {
            for (String morseChar : word.split(" ")) {
                if (!morseChar.isEmpty()) {
                    System.out.print(map.get(morseChar));
                }
            }
            System.out.print(" ");
        }
    }