Почему мой Java-переводчик азбуки Морзе выдает неверный результат?

Я видел много вопросов о переводчике азбуки Морзе и просмотрел многие из них, но во всех из них предложенный ответ дает мне один и тот же неверный результат. Идея кода состоит в том, чтобы иметь возможность переводить азбуку Морзе на английский язык и наоборот с помощью массивов. Мой код выглядит следующим образом:

import java.util.Scanner;
public static void main ( String [] args )
{

    String [] morse = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "|"};

    String [] 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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " "};

    Scanner input = new Scanner ( System. in );
    System.out.println ( "Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
    int userChoice = input.nextInt();
    String translateMe;

    while (userChoice < 1 || userChoice > 2 ) // Ensures user enters a valid choice
    {
        System.out.println( "Not a valid entry. Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
        userChoice = input.nextInt();
    }

   if (userChoice == 1 )
    {
        System.out.println("Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '" );
        translateMe = input.next();

        String [] morseChar = translateMe.split(" ");

        for( int x = 0; x < morseChar.length; x++)
        {
            String letter = morseChar[ x ];
            for ( int index = 0; index < morse.length; index++ )
            {
                if(morse [ index ].equals(letter))
                {
                    System.out.print(english[ index ]); // Display character at matching index position of English array to show translation
                }
            }
        }

        }

    else
    {
        System.out.println("Please enter an English statement to translate:");
        translateMe = input.next();
        translateMe = translateMe.toLowerCase();

        String [] englishChar = translateMe.split("(?!^)");

        for ( int x = 0; x < englishChar.length; x++)
        {
            String letter = englishChar [ x ];

            for (int index = 0; index < english.length; index++)
            {
                if( english [index].equals( letter ))
                {
                    System.out.print(morse[index] + " "); // Display Morse Code array character at matching index position to show translation
                }

            }
        }

    }

}

}

Я использовал фразу

to be

и его аналог азбуки Морзе

- --- | -… .

в качестве тестовой фразы. Когда я пытаюсь перевести с английского на азбуку Морзе с помощью этой фразы, я получаю

... -. с и н

как выход. Когда я пытаюсь перевести азбуку Морзе на английский язык, я получаю

u

как выход. Я просмотрел два своих массива строк, чтобы убедиться, что morse[A] и english[A] находятся в одной и той же позиции индекса и т. д., и все в порядке. Я не могу думать ни о чем другом, что могло бы вызвать эту проблему.

Изменить: может быть полезно знать, что я использую IntelliJ IDEA 15.


person Jes    schedule 26.02.2016    source источник


Ответы (4)


Перевод с азбуки Морзе на английский не работает из-за того, что вы используете Scanner. Вам нужно использовать nextLine() следующим образом:

if (userChoice == 1 )
{
    translateMe = input.nextLine();
    System.out.println("Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '" );
    translateMe = input.nextLine();

После этого вроде нормально переводится, даже с командой split.

Выход:

[.-, -..., -.-.]
abc

Выход 2:

Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '
- --- | -... .
[-, ---, |, -..., .]
to be
person Ian Mc    schedule 26.02.2016
comment
Это отлично работает для перевода с английского на азбуку Морзе, но с азбуки Морзе на английский мне не хватает буквы "b" - person Jes; 26.02.2016
comment
Извини, Джес, что ты имеешь в виду, пропустив букву "б"? - person Ian Mc; 26.02.2016
comment
Ах, извините, буква "б" в моем тесте "чтобы быть" (от Морзе до английского) отсутствует. Я использовал это как тестовую фразу. - person Jes; 26.02.2016
comment
Ах... Хорошо, позвольте мне попытаться сделать карту, чтобы перемещаться вперед и назад и посмотреть, что у меня получится. - person Ian Mc; 26.02.2016
comment
Если это поможет, все остальные входы, кажется, работают нормально в обоих направлениях. Даже буква «б» сама по себе и другие слова, содержащие букву «б». - person Jes; 26.02.2016
comment
У меня не было проблем с отображением (см. вывод 2 выше). Вы уверены, что удалили лишнюю букву Морзе "n" из массива? - person Ian Mc; 26.02.2016
comment
Когда я набрал азбуку Морзе, мой вывод в порядке. Я копировал и вставлял раньше, так что, должно быть, это было проблемой. Спасибо! - person Jes; 26.02.2016
comment
Добро пожаловать. Сканер может быть хитрым. Когда вы используете getInt(), а затем хотите прочитать строку String, вам нужно использовать Scanner, как вы это делаете сейчас. - person Ian Mc; 26.02.2016

  1. Код для n ("-.") появляется в вашем массиве дважды.
  2. Вероятно, вам лучше преобразовать строку в char[]. Вам придется изменить алфавит с String[] на char[].
  3. Вот почему у нас есть Map.
person bradimus    schedule 26.02.2016
comment
Благодарю вас! Думаю, я пропустил его из-за того, что так долго смотрел на него. Теперь я получаю вывод Морзе для «to» и английский вывод «t», поэтому мой переводчик останавливается слишком рано. Любые идеи? - person Jes; 26.02.2016
comment
См. комментарий @Ian. Это объяснит отсутствие вывода. - person bradimus; 26.02.2016

Я не могу понять вывод, который вы получаете - хотя я не пробовал его запускать, глядя на него, я вижу совсем другой результат.

Однако, по сути, ваш переводчик с морзе на английский слишком рано совпал. Вам нужно проверить всю строку.

Редактировать: теперь ничего очевидного не выделяется, вы пытались пройти через это с помощью отладчика, чтобы увидеть, что на самом деле происходит?

person Loren Pechtel    schedule 26.02.2016
comment
Приношу свои извинения, я разместил предыдущую версию своего кода. Я отредактировал исходный код до того, что у меня есть сейчас. Эта версия (я думаю) проходит через весь пользовательский ввод. Однако обе версии дают мне один и тот же неверный вывод. - person Jes; 26.02.2016
comment
Отладчик выдает мне "- --- Отключено от целевой ВМ, адрес: "127.0.0.1:61223", транспорт: "сокет"", но я, честно говоря, понятия не имею, что это значит. - person Jes; 26.02.2016

Причина, по которой вы получаете «s» и «n» из английского перевода, заключается в том, что если мы проверим слово «to», предыдущая буква в алфавите до «t» будет «s», а предыдущая буква в алфавите до «o». " равно "n", так что это наводит меня на мысль, что здесь есть ошибка зацикливания. Кроме того, вы используете «next()» вместо «nextLine()», поэтому вы не анализируете то, что вы думаете. Я думаю, что если вы используете "nextLine()" и исправите свой цикл, он у вас будет. Спасибо за предоставление полного исходного кода! :D

Вот как я тестировал:

import java.util.Scanner;

общественный класс Основной {

public static void main ( String [] args )
{

    String [] morse = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "|"};

    String [] 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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " "};

    Scanner input = new Scanner ( System. in );
    System.out.println ( "Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
    int userChoice = input.nextInt();
    String translateMe;

    while (userChoice < 1 || userChoice > 2 ) // Ensures user enters a valid choice
    {
        System.out.println( "Not a valid entry. Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
        userChoice = input.nextInt();
    }

    if (userChoice == 1 )
    {
        System.out.println("Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '" );
        translateMe = input.next();

        String [] morseChar = translateMe.split(" ");

        for( int x = 0; x < morseChar.length; x++)
        {
            System.out.println("Comparing " + morseChar + " to the morse array");
            for ( int index = 0; index < morse.length; index++ )
            {
                System.out.println("Comparing equality of: " + morseChar[x] + " and " + morse[index]);
                if(morseChar[x].equals(morse[index]))
                {
                    System.out.print(english[ index ]); // Display character at matching index position of English array to show translation
                }
            }
        }

    }

    else
    {
        System.out.println("Please enter an English statement to translate:");
        translateMe = input.next();
        translateMe = translateMe.toLowerCase();
        System.out.println(" Translating:  [" + translateMe + "]");

        System.out.println("Translating: " + translateMe);
        String[] englishChar = translateMe.split(" ");

        for(String s : englishChar) {
            System.out.println("Translation String: " + s);
        }

        for ( int x = 0; x < englishChar.length; x++)
        {
            System.out.println("Checking word: " + englishChar[x]);
            for (int index = 0; index < english.length; index++)
            {
                System.out.println("Comparing equality of: " + englishChar[x] + " and " + english[index] + " they are " + (englishChar [ x ].equals( english[index]) ? " equal" :  " not equal"));
                if( englishChar [ x ].equals( english[index]))
                {
                    System.out.print(morse[index] + " "); // Display Morse Code array character at matching index position to show translation
                }

            }
        }

    }

}

}

person kondrak    schedule 26.02.2016