Преобразование буквы в азбуку Морзе работает только для одной буквы каждый прогон
Я пытаюсь вывести азбуку Морзе. В настоящее время я сопоставляю введенное письмо с соответствующей буквой азбуки Морзе. У меня проблема в том, что после ввода одной буквы, следующие буквы не будут выводиться.
Мой код ниже:
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 ответ
Он будет читать только одно значение, так как этот код выполняется один раз, и вы не получите письмо, например, если передаете слово.
Если вы наберете "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 I изменил код на этот
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();
}
}
Это бессмысленно использовать для, когда у вас есть get()
метод