使用split方法将字符串转换为字符

时间:2013-10-13 22:08:08

标签: java regex arrays string split

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

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”。我的目的是首先修剪包含莫尔斯电码字符的数组中每个字符串末尾的额外空格,然后将用户的输入分割为每个字母之间的空格并匹配部分,最后显示相应的字符。带有英文字母的数组。如何让我的程序将用户在摩尔斯电码中的输入翻译成英文?

1 个答案:

答案 0 :(得分: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

然而,就时间复杂度(找到匹配所需的时间)和代码本身的复杂性而言,这是找到匹配的一种非常低效的方式。您可以将这两个数组推送到HashMap并简单地进行查找,而不是在每个莫尔斯代码段上遍历整个数组以尝试找到匹配项:

// 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);