电话键盘组合

时间:2015-02-03 05:18:28

标签: java arrays string recursion

对于家庭作业,我试图打印所有可能使用电话上的数字键盘表示的字母组合。此问题与此处发布的问题相同:How can I print out all possible letter combinations a given phone number can represent?

我不断得到一个超出范围的String索引:0问题,但我不是100%肯定为什么。这是代码:

public class TelephoneKeyPad2 {
public static String keyPad[][] = {
        {"0"}, {"1"}, {"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"}
};

public static void tpK(String num, StringBuilder combination) {
    if (num.length() == 0) {
        System.out.println(combination);
    }

    for (String letter: keyPad[Character.getNumericValue(num.charAt(0))]) {
        tpK(num.substring(1), combination.append(letter));
    }
}

public static void main(String[] args) {
    tpK("345", new StringBuilder());
} }

我感觉这是因为if语句...在确认num.length == 0之后没有办法打破递归,因此字符串索引超出范围。我不知道如何解决这个问题,任何帮助将不胜感激。

编辑:那么之后似乎可能只是一个逻辑问题。

DGJ

DGJK

DGJKL

DGJKLHJ

DGJKLHJK

是示例输出,所以现在我真的很困惑如何解决这个问题。

3 个答案:

答案 0 :(得分:0)

添加else语句,以便只有在超过0个字符时才执行for循环:

public static void tpK(String num, StringBuilder combination) {
    if (num.length() == 0) {
        System.out.println(combination);
    } else {

        for (String letter: keyPad[Character.getNumericValue(num.charAt(0))]) {
            tpK(num.substring(1), combination.append(letter));
        }
    }
}

答案 1 :(得分:0)

我解决了我遇到的另一个问题。事实证明,StringBuilder似乎创建了一个静态对象(?)。当程序经过递归时,它只实例化一个对象。我将StringBuilder类型更改为String并使用concat方法来解决问题。

答案 2 :(得分:-1)

如果num.length()为0,您仍然会继续询问num.charAt(0)