【问题标题】:Translating strings to characters using the split method使用 split 方法将字符串转换为字符
【发布时间】:2013-10-13 22:08:08
【问题描述】:

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

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

【问题讨论】:

  • 您自己说过要用“|”分隔单词。你为什么忽略这个事实?
  • @PM77-1 - 他没有忽略它。他将管道字符翻译成空格(以分隔单词)。这种情况是每个数组中的最后一个条目。
  • 您的第二个循环似乎有错误的界限:for (int i = 0; i &lt; parts.length; ++i)。应该是codes.length
  • @DaoWen - 我认为这是一个错误的决定。我会做两级拆分。
  • @PM77-1 - 你有比“我会做不同的事情”更好的论据吗?您的解决方案可能更直观,但 OP 的解决方案只需要您检查输入字符串一次即可进行拆分。但是,在那里获得的任何性能提升都会被他在这里与双嵌套循环所做的 O(n^2) 蛮力字符串匹配所杀死......

标签: java regex arrays string split


【解决方案1】:

正如我在上面的评论中所说,问题是边界错误。您的内部循环应该遍历 codes 数组中的每个索引,但您使用 parts.length 作为上限。由于您的示例输入只有 14 个段,因此内部循环仅尝试匹配字母表的前 14 个字母。这意味着 N 之后的任何字母都不会出现。如果过滤掉N之后的所有字母,那么THIS IS A TEST 变为 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    相关资源
    最近更新 更多