2016-02-24 2 views
1

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

public static void StringtoMorse(String str){ 
    char Alphabet [] = {'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', ' '}; 
    String MorseCode [] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "|"}; 


    for (int i = 0; i < str.length(); i ++){ 
     for (int j = 0; j < Alphabet.length; j ++){ 
      if (str.charAt(i) == Alphabet[j]){ 
       System.out.print(MorseCode[j] + " "); 
      } 
     } 
    } 


} 

Но я хочу, чтобы сделать метод так, что он возвращает строку (Азбука Морзе [J] + "«) , Так вот как я отредактировал свой метод для этого:

public static String StringtoMorse(String str){ 
    char Alphabet [] = {'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', ' '}; 
    String MorseCode [] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "|"}; 


    for (int i = 0; i < str.length(); i ++){ 
     for (int j = 0; j < Alphabet.length; j ++){ 
      if (str.charAt(i) == Alphabet[j]){ 
       return(MorseCode[j] + " "); 
      } 
     } 
    } 


} 

Но это приводит к ошибке компиляции. Ошибка говорит: «Этот метод должен возвращать результат типа String», но я думал, что (MorseCode [j] + «») является строковым типом. Я знаю, что MorseCode [j] должен быть строкой, потому что я определил MorseCode как массив String.

Если я использую первый метод (с помощью метода System.out.println()), он правильно возвращает результат.

ответ

5

Вашего метод должны иметь обратные инструкции после для петель тоже в том случае, для петель никогда не вводится или входная строка содержит символ, который не соответствует ни одному из Alphabet (в этом случае условие if никогда правда).

public static String StringtoMorse(String str){ 
    char Alphabet [] = {'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', ' '}; 
    String MorseCode [] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "|"}; 


    for (int i = 0; i < str.length(); i ++){ 
     for (int j = 0; j < Alphabet.length; j ++){ 
      if (str.charAt(i) == Alphabet[j]){ 
       return(MorseCode[j] + " "); 
      } 
     } 
    } 
    return null; 
} 

Однако, я не уверен, что ваш метод делает то, что вы хотите, чтобы это сделать, так как это было бы просто вернуть код Морзе первого символа в строке ввода. Вероятно, вы хотите перевести всю строку ввода в Morse.

Вот альтернативная реализация, которая будет конвертировать всю входную строку Морзе:

public static String StringtoMorse(String str){ 
    char Alphabet [] = {'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', ' '}; 
    String MorseCode [] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "|"}; 

    StringBuilder morse = new StringBuilder(); 
    for (int i = 0; i < str.length(); i ++){ 
     for (int j = 0; j < Alphabet.length; j ++){ 
      if (str.charAt(i) == Alphabet[j]){ 
       morse.append(MorseCode[j]); 
       morse.append(' '); 
      } 
     } 
    } 
    return morse.toString(); 
} 

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

public static String StringtoMorse(String str){ 

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

    StringBuilder morse = new StringBuilder(); 
    for (int i = 0; i < str.length(); i ++){ 
     if (str.charAt(i) >= 'a' and str.charAt(i) <= 'z'){ 
      morse.append(MorseCode[str.charAt(i)-'a']); 
      morse.append(' '); 
     } else if (str.charAt(i) == ' ') { 
      morse.append("| "); 
     } 
    } 
    return morse.toString(); 
} 
+0

Ну что возвращает код код Морзе каждого символа во входной строке. Он работает на выходе. Но спасибо за отзывы. Что именно делает метод возврата null? – LightFlicker

+0

@LightFlicker Код возвращает только код Морзе первого символа входной строки, который появляется в массиве Алфавит. Возвращаемое значение null возвращает значение по умолчанию, если нет возвращаемого кода Морзе (вы также можете вернуть пустую строку, если хотите) - например, если 'str' является пустой строкой. – Eran

+0

В вашем ответе вы сказали morse.append (MorseCode [str.charAt (i) - 'a']); Но str.charAt (i) - 'a' вернет строку, не так ли? Итак, как это может быть указателем термина в MorseCode? – LightFlicker

Смежные вопросы