Переводчик с азбуки Морзе на английский дает ArrayIndexOutOfBounds

#java #exception #morse-code

Вопрос:

Я должен создать переводчик морзе на английский и наоборот. Часть с английского на морзе работает, но всякий раз, когда я пытаюсь ввести что-то на морзе, это дает мне исключение 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 resu< 
        System.out.println("Enter 1 for English to Morse code. Enter 2 for Morse to English:");
        translatorChoice = input.nextInt();
        if (translatorChoice != 1 amp;amp; 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, userInput, 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]);
                }}}}
 

Комментарии:

1. Я еще не пробовал, но просто глядя на код, это кажется неправильным: for (int j = 0; j < morse.length; i ) разве это не должно быть j ?

2. как вы собираетесь различать входные данные, такие как»…», это O или просто FFF???

3. @ka177, я попытался внести изменения, как для (int j = 0; j длина; j ), а затем выполнил его против . — ввод, и я получил вывод как et, подключенный к целевой виртуальной машине, адрес: ‘127.0.0.1:51566’, транспорт: ‘сокет’ Введите 1 для перевода с английского на азбуку Морзе. Введите 2 для перевода Морзе на английский: 2 Пожалуйста, введите предложение в переводчик: .- et

4. @karthikakinapelli Как получить IP — адрес с этим кодом??

5. @RubioRic, я запустил код из intellij , поэтому IP-адрес, который вы видите в моем комментарии, взят из консоли Intellij 🙂

Ответ №1:

Вот рабочий код. 3 изменения должны были быть внесены, прежде всего, разделение "|" должно было быть изменено, чтобы исправить регулярное "\|" выражение, чтобы буквально разделить '|' . split() принимает регулярное выражение в качестве аргумента и '|' является специальным символом в регулярном выражении, поэтому вам нужно экранировать его с помощью regexe , но затем при переводе регулярного выражения в строку java вы снова экранируете его. В результате получается \|
Во-вторых, внутренний for цикл может остановиться, когда строки совпадают, таким образом, добавляется разрыв.
В-третьих, переменная i изменена j на for приращение внутреннего цикла.

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

Ответ №2:

итак, я думаю, что это можно было бы сделать с небольшой логической переработкой

 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. Теперь мы перебираем все символы во входных данных пользователей, находим индекс этого символа в английской строке, а затем используем этот индекс для получения представления кода Морзе.