摩尔斯电码到英语翻译器给出 ArrayIndexoutofBounds

问题描述

我必须创建莫尔斯英语,反之亦然翻译。莫尔斯英语部分有效,但是每当我尝试以莫尔斯格式输入某些内容时,它都会给我一个 ArrayIndexOutofBounds 异常,我一直在解决如何修复它。我已经加入了一个拆分函数,但我不确定为什么会出现异常。

public static void main(String[] args) throws IOException {
        Scanner input = new Scanner(system.in);
        BufferedReader br = new BufferedReader(new InputStreamReader(system.in));
        char[] english = { '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'};
        String[] morse = { ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","|" }
        String userInput;
        int translatorChoice;
        String result; 
        System.out.println("Enter 1 for English to Morse code. Enter 2 for Morse to English:");
        translatorChoice = input.nextInt();
        if (translatorChoice != 1 && translatorChoice !=2 ){
            throw new ArithmeticException("Please enter a valid number");
        }
        System.out.println();
        System.out.println("Please input sentence into the translator:");
        userInput = br.readLine();

        if (translatorChoice == 1){
            userInput = userInput.toLowerCase();
            englishtoMorse(morse,userInput,english);}
        else if(translatorChoice == 2) {
            morsetoEnglish(english,morse);}
public static void morsetoEnglish (char[] english,String userInput,String[] morse){
        String[] input = userInput.split("|");
        for (int i = 0; i < input.length; i++){
            for (int j = 0; j < morse.length; i++){
                if (morse[j].equals(input[i])) {    
                    System.out.print(english[j]);
                }}}}

解决方法

所以,我认为这可以通过一些逻辑重新工作来实现

public static void englishToMorse(char[] english,String userInput,String[] morse){
    char[] chars = userInput.toCharArray();

    String englishCharsAsString = new String(english);
    for (char character: chars) {
        if (character == ' ') {
            System.out.println(" ");
            continue;
        }

        int index = englishCharsAsString.indexOf(character);
        System.out.println(morse[index]);
    }
}

让我解释一下这里发生了什么,我们还应该能够对其进行逆向工程以制作 morseToEnglish 方法。

  1. 因此,我们首先获取用户输入并将其转换为字符数组,这样我们就知道用户的各个字符是什么。
  2. 接下来,我们将英文字符数组转换为一个字符串,这样我们就可以找到该字符串中字母的索引,并将其映射到莫尔斯电码数组
  3. 现在我们遍历用户输入中的所有字符,在英文字符串中找到该字符的索引,然后使用该索引获取莫尔斯电码表示。
,

这是工作代码。需要进行 3 处更改,首先,必须更改 "|" 上的拆分以更正正则表达式 "\\|" 以字面上拆分 '|'split() 将正则表达式作为参数,而 '|' 是正则表达式中的特殊字符,因此您需要使用正则表达式的 \ 对其进行转义,但是,当将正则表达式转换为 java 字符串时,您将对其进行转义再次。结果是\\|
其次,内部 for 循环可以在字符串匹配时停止,因此添加了中断。
第三,变量 i 在内部 j 循环增量中更改为 for

    public static void morsetoEnglish (char[] english,String[] morse){
        String[] input = userInput.split("\\|");
        for (int i = 0; i < input.length; i++){
            for (int j = 0; j < morse.length; j++){
                if (morse[j].equals(input[i])) {    
                    System.out.print(english[j]);
                    break;
                }
            }
            
        }
    }

这是一些测试输入/输出:

Enter 1 for English to Morse code. Enter 2 for Morse to English:
2
Please input sentence into the translator:
.--.|.|-|
pet