1

我的程序是将输入从英语翻译成摩尔斯电码,反之亦然。首先,它会提示用户输入莫尔斯电码还是英语。之后,它将一个翻译成另一个。我正在研究如何将摩尔斯电码翻译成英语。我正在使用这个包含摩尔斯字母的数组:

String[] codes = {".- ", "-... ", "-.-. ", "-.. ", ". ", "..-. ", "--. ", ".... ", ".. ", ".--- ", "-.- ", ".-.. ", "-- ", "-. ", "--- ", ".--. ", "--.- ", ".-. ", "... ", "- ", "..- ", "...- ", ".-- ", "-..- ", "-.-- ", "--.. ", ".---- ", "..--- ", "...-- ", "....- ", "..... ", "-.... ", "--... ", "---.. ", "----. ", "----- ", "| "};

用户的输入必须以特定方式格式化。输入摩尔斯电码时,每组代表一个字母的字符必须用空格隔开。每个完整的单词必须用直线(“|”)分隔。标点和大写不是必需的。

这是一个澄清的例子:

输入:

 - .... .. ... | .. ... | .- | - . ... -

输出:

THIS IS A TEST

我的代码如下:

import javax.swing.JOptionPane;

public class ProjectOne
{
    public static void main (String[] args)
    {
        String decision = getString ("Will you be typing in English or Morse Code?");
        String english = "english";
        String morse = "morse";
        String[] codes = {".- ", "-... ", "-.-. ", "-.. ", ". ", "..-. ", "--. ", ".... ", ".. ", ".--- ", "-.- ", ".-.. ", "-- ", "-. ", "--- ", ".--. ", "--.- ", ".-. ", "... ", "- ", "..- ", "...- ", ".-- ", "-..- ", "-.-- ", "--.. ", ".---- ", "..--- ", "...-- ", "....- ", "..... ", "-.... ", "--... ", "---.. ", "----. ", "----- ", "| "};
        char[] letters = {'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', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ' '};

        if (decision.equalsIgnoreCase(morse))
        {
            for (int a = 0; a < codes.length; a++)
            {
                codes[a] = codes[a].trim();
            }

            String input = getString ("Enter a phrase to be translated to English:");
            String[] parts = input.split(" ");

            for (int n = 0; n < parts.length; n++)
            {
                for (int i = 0; i < parts.length; ++i)
                {
                    if (parts[n].equals(codes[i]))
                    {
                        System.out.print(letters[i]);
                    }
                }
            }
        }
        else if (decision.equalsIgnoreCase(english))
        {
            //Translates English to Morse Code
        }
        else
        {
            System.out.println("Invalid Input - Type 'English' or 'Morse'");
        }
    }

    public static String getString(String paramString)
    {
        String str = JOptionPane.showInputDialog(paramString);
        return str;
    }
}

我的问题是翻译成英文根本不正确。在尝试我上面提供的示例时,输出显示为“HIIAE”。我的意图是首先修剪包含摩尔斯电码字符的数组中每个字符串末尾的额外空格,然后将用户的输入按每个字母之间的空格拆分并匹配部分,然后最后显示相应的字符带有英文字母的数组。我该怎么做才能让我的程序将用户在摩尔斯电码中的输入翻译成英语?

4

1 回答 1

3

正如我在上面的评论中所说,问题是边界错误。您的内部循环应该遍历codes数组中的每个索引,但您将parts.length其用作上限。由于您的示例输入只有 14 个段,因此内部循环仅尝试匹配字母表的前 14 个字母。这意味着 N 之后的任何字母都不会出现。如果过滤掉 N 之后的所有字母,则T HI S I S A T E ST变为HIIAE。看起来熟悉?

此版本正常工作:

        for (int n = 0; n < parts.length; n++)
        {
            for (int i = 0; i < codes.length; ++i)
            { //                ^ Fixed the loop bound here
                if (parts[n].equals(codes[i]))
                {
                    System.out.print(letters[i]);
                    break; // Quit inner loop once you find a match
                }
            }
        }
        System.out.println(); // Add a trailing newline

但是,无论从时间复杂度(找到匹配项需要多长时间)和代码本身的复杂性来看,这都是一种非常低效的查找匹配项的方法。与其为每个莫尔斯电码段循环遍历整个数组以尝试找到匹配项,不如将两个数组都推入 aHashMap并更简单地进行查找:

// Initialize the map for Morse code lookup
Map<String, Character> lookup = new HashMap<>();
for (int i=0; i<codes.length; i++) lookup.put(codes[i], letters[i]);

// Build the result string by looking up each Morse code segment in the map
StringBuilder result = new StringBuilder();
for (int i=0; i<parts.length; i++) result.append(lookup.get(parts[i]));
System.out.println(result);
于 2013-10-13T22:42:19.670 回答