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

Java:将英语翻译成摩尔斯电码时出错(不是重复的),java,Java,我正在创建一个项目,将摩尔斯电码翻译成英语,并将英语翻译成摩尔斯电码。程序应提示用户指定所需的翻译类型,输入一串莫尔斯电码字符或英语字符,然后显示翻译结果。所有大小写、数字和标点符号都可以忽略。请不要使用哈希表和映射 我成功地完成了将英文翻译成莫尔斯的部分。然而,当把摩尔斯电码翻译成英语时,似乎有很多错误。但我不明白为什么 因此,任何正在阅读本文的人,如果你能帮我解决这个错误,我将不胜感激!任何帮助都将不胜感激。非常感谢你 控制台上显示的错误消息如下: 线程“main”java.lang.Str

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

我成功地完成了将英文翻译成莫尔斯的部分。然而,当把摩尔斯电码翻译成英语时,似乎有很多错误。但我不明白为什么

因此,任何正在阅读本文的人,如果你能帮我解决这个错误,我将不胜感激!任何帮助都将不胜感激。非常感谢你

控制台上显示的错误消息如下:

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

公共类转换器
{
公共静态字符串[]morse={“-”,“-…”,“-.-”,“-…,”,
"..-. ", "--. ", ".... ", ".. ",
".--- ", "-.- ", ".-.. ", "-- ", "-. ", "--- ", ".--. ", "--.- ",
".-. ", "... ", "- ", "..- ",
"...- ", ".-- ", "-..- ", "-.-- ", "--.. ", "|" };
公共静态字符串[]字母={“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”和“};
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
System.out.println(“输入'1'将英语翻译成摩尔斯电码”);
System.out.println(“输入'2'将摩尔斯电码翻译成英语。”);
int kind=in.nextInt();
如果(种类==1){
System.out.println(“请插入字母字符串”);
字符串Eng=in.next();
英格托莫(英语);
}
如果(种类==2){
System.out.println(“请插入莫尔斯字符串”);
字符串Mor=in.next();
MoToEng(铁道部);
}
}
公共静态void EngToMo(字符串string1){
String Upper1=string1.toUpperCase();
对于(int i=0;i
此代码存在一些问题

第一个是导致异常的原因

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

其次,您在莫尔斯电码表中包含空格,因此该电码永远无法与字符串中的最后一个莫尔斯电码匹配,因此它永远不会与字符串相匹配

但是,如果只删除字符串
-.
中的空格,则它将提前匹配

您可以简单地使用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] + " ");
                    }
                }
            }
        }
    }

显然,您可以按照用户902383的建议使用数组列表、拆分函数和indexOf,但这个答案只是为了纠正代码中的错误。

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

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

你有stacktrace吗?对不起,我刚开始学习java,什么是stack trace?@imibis我正在使用的IDE上写着:线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:java.lang.String.substring(String.java:1950)在Project1.MoToEng(Project1.java:58)在Project1.main(Project1.java:31)在控制台中出现的错误是红色的,y从1开始,每次循环时都增加y的值,y的最后一个值将是字符串的长度,这意味着您正在调用子字符串,y比字符串的最后一个索引高一个。我将启动java IDE来实现example@Danny例子created@Danny 此外,您可能希望在EngToMor中添加一些健全性检查,以便当有人将输入字符串
“!#2313451”
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();
  }
}
public static List<String> morse = Arrays.asList(".-", "-...", "-.-.",
            "-..", ".", "..-.", "--.", "....", "..", 
  "--..", "|");
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] + " ");
            }

        }
    }