对于家庭作业,我试图打印所有可能使用电话上的数字键盘表示的字母组合。此问题与此处发布的问题相同: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
是示例输出,所以现在我真的很困惑如何解决这个问题。
答案 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)
。