Я пытаюсь вывести азбуку Морзе. В настоящее время я сопоставляю введенную букву с соответствующей буквой азбуки Морзе. Проблема, с которой я сталкиваюсь, заключается в том, что после ввода одной буквы следующие буквы не дадут результата.
Мой код ниже:
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;
}
}
Любая помощь будет оценена.
@StephenC, честно говоря, в SO довольно часто опускают операторы импорта в интересах краткости при отображении кода. При обычном импорте компилируется нормально.
Если ОП публикует код, которому он / она хочет помочь с отладкой, и код не компилируется, то это не MCVE, и вопрос не по теме. Честно говоря ... Я действительно оказал ОП значительную помощь!
Возможно, лучше использовать Map<Character, String> вместо Map<String, String>.
@JeRiF ты проверил мой ответ?




Он будет читать только одно значение, так как этот код выполняется один раз, и вы не получите букву, например, если вы передаете слово.
Вы набираете «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 пытающийся: преобразовывает слова в азбуку Морзе.
Обновил ответ @StephenC, я просто следил за его кодом, вы правы, так лучше.
И я не думаю, что этот код делает то, что на самом деле пытается сделать OP: преобразует слова в код Морзе> Этот код, если вы наберете Hello, он напечатает Hello на языке Морзе, вы пробовали?
Я прокомментировал вашу первоначальную переписку цикла ... которая, если я правильно ее прочитаю, рандомизирует буквы в слове при переводе. (Это то, что сделал бы код OP, если бы он искал односимвольные строки, но это неправильно.) В вашем более позднем EDIT нет этой проблемы.
Зачем это рандомизировать? Это цикл for, который начинается с h и заканчивается на o, если это слово hello, верно? А теперь ответ нормальный?
Потому что вы переводите и печатаете буквы в порядке клавиш на карте (случайно), а не в порядке букв во входной строке. (Если бы карта была TreeMap, ваш код работал бы....) Теперь вам может повезти... и ключи в карте могут быть в случайном порядке при повторении. Но рассчитывать на это не стоит, .
О, теперь я вас понял, да, он напечатает сначала «E», затем «H», и так .. хорошо, да, хорошая мысль;)
1) В вашей программе есть ошибки компиляции. Это не сработает, если вы не сможете его скомпилировать. 2) Суть карты в том, что вы Погляди ключ с помощью метода
get(...). 3) Строка "BD" не является ключом для таблицы. Все ключи представляют собой односимвольные строки. Итак, вам нужно найти одну строку символов. Теперь мы могли бы исправить ваш код для вас, но это побеждает цель вашей домашней работы/упражнения. Так что рекомендую вам воспользоваться этими подсказками и разобраться, как исправить программу самостоятельно.