Преобразование буквы в азбуку Морзе работает только для одной буквы при каждом запуске

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

Мой код ниже:

public class Example {

    public static void main(String[] args) {
        Map<String, String> map = createAlphabet();
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();

        for (Map.Entry<String , String> entry : map.entrySet()){
            if (entry.getKey().equalsIgnoreCase(s)){
                System.out.println(entry.getValue());
            }
        }

    }

    public static Map<String , String> createAlphabet() {
        Map<String , String> alphabet = new HashMap<>();

        alphabet.put("A" , ".-");
        alphabet.put("B" , "-...");
        alphabet.put("C" , "-.-");
        alphabet.put("D" , "-..");
        alphabet.put("E" , ".");
        alphabet.put("F" , "..-.");
        alphabet.put("G" , "--.");
        alphabet.put("H" , "....");
        alphabet.put("I" , "..");
        alphabet.put("J" , ".---");
        alphabet.put("K" , "-.-");
        alphabet.put("L" , ".-..");
        alphabet.put("M" , "--");
        alphabet.put("N" , "-.");
        alphabet.put("O" , "---");
        alphabet.put("P" , ".--");
        alphabet.put("Q" , "--.-");
        alphabet.put("R" , ".-.");
        alphabet.put("S" , "...");
        alphabet.put("T" , "-");
        alphabet.put("U" , "..-");
        alphabet.put("V" , "...-");
        alphabet.put("W" , ".--");
        alphabet.put("X" , "-..-");
        alphabet.put("Y" , "-.--");
        alphabet.put("Z" , "--..");


        return alphabet;
    }
}

Любая помощь будет оценена.

1) В вашей программе есть ошибки компиляции. Это не сработает, если вы не сможете его скомпилировать. 2) Суть карты в том, что вы Погляди ключ с помощью метода get(...). 3) Строка "BD" не является ключом для таблицы. Все ключи представляют собой односимвольные строки. Итак, вам нужно найти одну строку символов. Теперь мы могли бы исправить ваш код для вас, но это побеждает цель вашей домашней работы/упражнения. Так что рекомендую вам воспользоваться этими подсказками и разобраться, как исправить программу самостоятельно.

Stephen C 22.01.2019 10:24

@StephenC, честно говоря, в SO довольно часто опускают операторы импорта в интересах краткости при отображении кода. При обычном импорте компилируется нормально.

DodgyCodeException 22.01.2019 10:39

Если ОП публикует код, которому он / она хочет помочь с отладкой, и код не компилируется, то это не MCVE, и вопрос не по теме. Честно говоря ... Я действительно оказал ОП значительную помощь!

Stephen C 22.01.2019 10:40

Возможно, лучше использовать Map<Character, String> вместо Map<String, String>.

DodgyCodeException 22.01.2019 11:54

@JeRiF ты проверил мой ответ?

Skizo-ozᴉʞS 22.01.2019 19:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
5
68
1

Ответы 1

Он будет читать только одно значение, так как этот код выполняется один раз, и вы не получите букву, например, если вы передаете слово.

Вы набираете «D», он напечатает «-..», потому что это один символ, но если вы наберете «HELLO», он не напечатает полное слово, потому что вам нужно разделить символы и напечатать их один за другим.

Если вы измените свой цикл на этот, он будет делать то, что вы хотите:

for (Map.Entry<String , String> entry : map.entrySet()){
        for(int i = 0; i<s.length(); i++){
            if (entry.getKey().equalsIgnoreCase(String.valueOf(s.charAt(i)))){
                System.out.print(entry.getValue() + " ");
            }
        }
    }

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

public static void main(String[] args) {
    Map<String, String> map = createAlphabet();
    Scanner in = new Scanner(System.in);
    String s = in.nextLine();
    while(!s.equals(".")){
        for (Map.Entry<String , String> entry : map.entrySet()){
            for(int i = 0; i<s.length(); i++){
                if (entry.getKey().equalsIgnoreCase(String.valueOf(s.charAt(i)))){
                    System.out.print(entry.getValue() + " ");
                }
            }

        }
        System.out.println();
        s = in.nextLine();
        System.out.println();
    }

}

Редактировать

Как предложил @Stephen C, я изменил код на этот

public static void main(String[] args) {
        Map<String, String> map = createAlphabet();
        Scanner in = new Scanner(System.in);
        String s = in.nextLine().toUpperCase();
        while (!s.equals(".")) {
            for (int i = 0; i < s.length(); i++) {
                System.out.print(map.get((String.valueOf(s.charAt(i))))+ " ");
            }
            System.out.println();
            s = in.nextLine().toUpperCase();
            System.out.println();
        }

    }

Бессмысленно использовать for, когда у вас есть метод get()

За исключением .... зачем вам повторять записи карты? Используйте get. И я не думаю, что этот код делает то, что на самом деле делает OP пытающийся: преобразовывает слова в азбуку Морзе.

Stephen C 22.01.2019 10:29

Обновил ответ @StephenC, я просто следил за его кодом, вы правы, так лучше.

Skizo-ozᴉʞS 22.01.2019 10:39

И я не думаю, что этот код делает то, что на самом деле пытается сделать OP: преобразует слова в код Морзе> Этот код, если вы наберете Hello, он напечатает Hello на языке Морзе, вы пробовали?

Skizo-ozᴉʞS 22.01.2019 10:40

Я прокомментировал вашу первоначальную переписку цикла ... которая, если я правильно ее прочитаю, рандомизирует буквы в слове при переводе. (Это то, что сделал бы код OP, если бы он искал односимвольные строки, но это неправильно.) В вашем более позднем EDIT нет этой проблемы.

Stephen C 22.01.2019 10:46

Зачем это рандомизировать? Это цикл for, который начинается с h и заканчивается на o, если это слово hello, верно? А теперь ответ нормальный?

Skizo-ozᴉʞS 22.01.2019 10:48

Потому что вы переводите и печатаете буквы в порядке клавиш на карте (случайно), а не в порядке букв во входной строке. (Если бы карта была TreeMap, ваш код работал бы....) Теперь вам может повезти... и ключи в карте могут быть в случайном порядке при повторении. Но рассчитывать на это не стоит, .

Stephen C 22.01.2019 10:49

О, теперь я вас понял, да, он напечатает сначала «E», затем «H», и так .. хорошо, да, хорошая мысль;)

Skizo-ozᴉʞS 22.01.2019 10:53

Другие вопросы по теме