Java:将英语翻译成摩尔斯电码时出错(不是重复的)

Java: Error when translating English to Morse Code (Not a duplicate)

我正在创建一个将摩尔斯电码翻译成英语并将英语翻译成摩尔斯电码的项目。程序应提示用户指定所需的翻译类型,输入一串摩尔斯电码字符或英文字符,然后显示翻译结果。所有大小写、数字和标点符号都可以忽略。并且请不要使用哈希表和映射。

我成功地完成了将英语翻译成摩尔斯语的部分。然而,在将摩尔斯电码翻译成英语时,似乎出现了很多错误。但我不知道为什么。

所以任何正在阅读本文的人,如果你能帮助我解决错误,我将非常感激!任何帮助表示赞赏。非常感谢!

控制台上显示的错误消息是这样的:

线程异常 "main" java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:3 在 java.lang.String.substring(String.java:1950) 在 Project1.MoToEng(Project1.java:57) 在 Project1.main(Project1.java:30)

public class Translator
{
public static String[] morse = { ".- ", "-... ", "-.-. ", "-.. ", ". ",
        "..-. ", "--. ", ".... ", ".. ",

        ".--- ", "-.- ", ".-.. ", "-- ", "-. ", "--- ", ".--. ", "--.- ",
        ".-. ", "... ", "- ", "..- ",

        "...- ", ".-- ", "-..- ", "-.-- ", "--.. ", "|" };

public static String[] alphabet = { "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", " " };

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Input '1' to translate English to Morse Code.");
    System.out.println("Input '2' to translate Morse Code to English.");
    int kind = in.nextInt();

    if (kind == 1) {
        System.out.println("Please insert an alphabet string");
        String Eng = in.next();
        EngToMo(Eng);
    }
    if (kind == 2) {
        System.out.println("Please insert a morse string");
        String Mor = in.next();
        MoToEng(Mor);
    }

}

public static void EngToMo(String string1) { 
    String Upper1 = string1.toUpperCase();
    for (int i = 0; i < Upper1.length(); i++) {
        char character1 = Upper1.charAt(i);
        if (character1 != ' ') {
            System.out.print(morse[character1 - 'A'] + " ");
        } else {
            System.out.println(" | ");
        }
    }
}

public static void MoToEng(String string2) { 
int x = 0;
int y = 1;
String space = " ";
for (int i = 0; i < string2.length(); i++) {
    if(string2.substring(x,y).equals(space)){
        x++;
        y++;
    }
    else{
        y++;
        if(string2.substring(x,y).equals(morse[i])){
            System.out.println(alphabet[i]+ " ");
        }
    }
}
}
}

此代码存在一些问题。

首先是导致异常的原因,

因为 y 从 1 开始并在每次循环中增加 1,它将等于 string2 在其最后一次迭代中的长度。这意味着,由于字符串是零索引的,它将比字符串中的最后一个索引高一个,因此 string2.substring(x,y)

中的崩溃

其次,您在莫尔斯列表中包含 spaces,因此该代码永远无法匹配字符串中的最后一个莫尔斯代码,因此它永远不会匹配字符串 -. .

但是,如果您只是删除 space,它会提前匹配,即匹配字符串 -.--.

中的 -.

您可以简单地使用 split 函数将输入字符串拆分为数组拆分 " "

示例代码

public static void MoToEng(String string2) {
        int x = 0;
        char space = ' ';
        for (int y = 1; y <= string2.length(); y++) {
            String match = null;
            if (y == string2.length()) {
                // Reached the end of the string
                match = string2.substring(x);
            } else if (string2.charAt(y) == ' ') {
                // Reached the end of the word
                match = string2.substring(x,y);
                x = y+1;
                if (x == string2.length()) {
                    x--;
                }
            }

            if (match != null) {
                for (int j = 0;j < morse.length;j++) {
                    if (morse[j].equals(match+" ")) {
                        System.out.println(alphabet[j] + " ");
                    }
                }
            }
        }
    }

注意:您可能 运行 遇到问题,因为您用来读取 system.in 的扫描仪将标记化并且只给您第一个 space。所以如果你使用扫描仪 class 你实际上只需要

for (int j = 0;j < morse.length;j++) {
  if (morse[j].equals(string2+" ")) {
    System.out.println(alphabet[j] + " ");
  }
}

如果你想在输入时使用完全匹配而不依赖扫描仪来完成艰苦的工作,请将你的第二个匹配更改为

if (kind == 2) {
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  System.out.println("Please insert a morse string");
  try {
    MoToEng(br.readLine());
  } catch (IOException e) {
    e.printStackTrace();
  }
}

显然,您可以按照 user902383 的建议使用数组列表、拆分函数和 indexOf,但此答案只是为了纠正代码中的崩溃。

我简化了您的方法 MoToEng,您需要将 morse 更改为列表,并且我还删除了条目中的空格

public static List<String> morse = Arrays.asList(".-", "-...", "-.-.",
            "-..", ".", "..-.", "--.", "....", "..", 
  "--..", "|");

并且您需要在 EngToMo 中将 System.out.print(morse[character1 - 'A'] + " "); 更改为 System.out.print(morse.get(character1 - 'A') + " ");,它将起作用

这应该可以正常工作

public static void MoToEng(String string2) {
        int x = 0;
        int y = 1;

        for (String token : string2.split("\s+")) {

            int index = morse.indexOf(token);
            if (index > -1) {
                System.out.println(alphabet[index] + " ");
            }

        }
    }