【问题标题】:Java - split morse, not recognizing single morse characterJava - 拆分莫尔斯,不识别单个莫尔斯字符
【发布时间】:2017-10-01 21:01:54
【问题描述】:

我正在拔头发…… 是的,它已经全部发布了,不,我似乎无法理解我的错误。我知道我正在尝试处理字符和字符串的细微差别。但是我的输出没有帮助,所以也许其他人可以?下面是我得到的输出和提供给我的代码。

输入:
...
没有输出

这个输入
... ---
输出
电子
电子
e

还有这个输入

...|---
输出
电子
电子
e

只有第一个莫尔斯“字符”(应该是'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);
}

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

【问题讨论】:

  • 欢迎来到 Stack Overflow!看来您需要学习使用调试器。请帮助自己一些complementary debugging techniques。如果您之后仍有问题,请随时回来提出更具体的问题。

标签: java


【解决方案1】:

您的代码有两个问题:

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

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

Demo.

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

【讨论】:

  • 好的,是的,数据结构很糟糕(@jeanr)。我倾向于在/如果我有时间的时候清理它(一些)。我更喜欢功能而不是时尚。虽然我知道灌输良好的做法。至于两个逃逸和修复 .length (我今天在某个时候有过,哈哈)它工作正常。我认为足以上交。谢谢大家!
  • @bubblyBibliophile 欢迎您。如果您在此问题上不需要其他帮助,请单击左侧的灰色复选标记接受其中一个答案。这会让其他人知道您的问题已解决,并在 Stack Overflow 上为您赢得一个新徽章。
【解决方案2】:

你写的代码有几个问题。

  1. 数据结构选得不好,对于这个用例,你最好使用Map,因为你关联了2个值。

  2. 您在正则表达式中使用的字符串不是好字符串,您需要转义它

  3. 避免使用局部变量可以使代码更具可读性

这是您想要的工作版本

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

【讨论】:

  • 真棒答案...我没有研究过 HashMap,因为我不确定它在课堂上是否允许。(Sheesh)。但是,我要自学并无论如何都要去做。呃... 2D 数组的用途是否与 HashMap 相同?我一直在考虑的其他事情。
  • 您也可以使用 2D 数组来实现,但它的性能将低于使用 HashMap(2D Array 为 O(n),而 HashMap 为 O(1))。如果此答案对您有所帮助,请不要犹豫,将您的帖子标记为已解决@bubblyBibliophile :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2015-09-03
相关资源
最近更新 更多