【问题标题】:Trouble returning a String from a nested for loop从嵌套的 for 循环返回字符串时遇到问题
【发布时间】:2016-06-06 21:47:02
【问题描述】:

我在 StackOverflow 上寻找可能回答我的问题的其他示例,但其他问题中的答案都没有集中在嵌套的 for 循环上。我正在制作一个摩尔斯电码翻译器,如果我这样做,程序本身就可以正常工作:

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] + " ");
            }
        }
    }


}

但我想创建该方法,以便它返回 (MorseCode[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] + " ");
            }
        }
    }


}

但这会导致编译错误。错误说“此方法必须返回字符串类型的结果”,但我认为 (MorseCode[j] + " ") 是字符串类型。 我知道 MorseCode[j] 必须是字符串,因为我已将 MorseCode 定义为字符串数组。

如果我使用第一种方法(使用 System.out.println() 方法),它会正确返回结果。

【问题讨论】:

    标签: java for-loop return


    【解决方案1】:

    你的方法也必须在 for 循环之后有一个 return 语句,以防永远不会输入 for 循环或输入字符串包含与任何 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;
    }
    

    但是,我不确定您的方法是否符合您的要求,因为它只会返回输入字符串中第一个字符的摩尔斯电码。您可能希望将整个输入字符串转换为摩尔斯。

    这是一个将整个输入字符串转换为摩尔斯的替代实现:

    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();
    }
    

    【讨论】:

    • 那么代码返回输入字符串中每个字符的摩尔斯电码。它在输出中起作用。但感谢您的反馈。 return null 方法到底是做什么的?
    • @LightFlicker 该代码将仅返回出现在 Alphabet 数组中的输入字符串的第一个字符的摩尔斯电码。 return null 返回一个默认值,以防没有要返回的摩尔斯电码(如果您愿意,也可以返回一个空字符串) - 例如,如果 str 是一个空字符串。
    • 在你的回答中,你说 morse.append(MorseCode[str.charAt(i)-'a']);但是 str.charAt(i)-'a' 会返回一个字符串,对吗?那么这怎么可能是摩尔斯电码中一个词的索引呢?
    • @LightFlicker str.charAt(i)-'a'是两个char的减法,就是一个char。 char 可以是数组的索引。
    • 我认为索引只能是整数值。
    猜你喜欢
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多