我正在研究一个传递3位字符串的项目,它应该返回所有可能的助记符组合的ArrayList。例如,如果我传入数字" 623",它应该返回一个列表 [MAD MBD MCD NAD NBD NCD OAD OBD OCD MAE MBE MCE NAE NBE NCE OAE OBE OCE MAF MBF MCF NAF NBF NCF OAF OBF OCF]。
然而,我一直得到[MAD,MADE,MADEF,MABD,MABDE,MABDEF,MABCD,MABCDE,MABCDEF,MNAD,MNADE,MNADEF,MNABD,MNABDE,MNABDEF,MNABCD,MNABCDE,MNABCDEF,MNOAD的结果, MNOADE,MNOADEF,MNOABD,MNOABDE,MNOABDEF,MNOABCD,MNOABCDE,MNOABCDEF]。我似乎无法弄清楚我在这里做错了什么..它本应该返回长度为3的字符串,它似乎只能修改前面的字母。
这是我的代码:
public class PhoneMnemonics {
public static void main(String[] args) {
ArrayList<String> test = listMnemonics("623");
System.out.print(test);
}
public static ArrayList<String> listMnemonics(String number) {
ArrayList<String> result = new ArrayList<String>();
recursiveMnemonics(result, "", number);
return result;
}
private static void recursiveMnemonics(ArrayList<String> result, String mnemonicSoFar, String digitsLeft) {
if (digitsLeft.length() == 0) {
// Add current mnemonic
result.add(mnemonicSoFar);
} else {
// Try all combinations for single digit
int numLetters = digitLetters(digitsLeft.charAt(0)).length();
String letters = digitLetters(digitsLeft.charAt(0));
if (digitsLeft.length() > 1 ) {
digitsLeft = digitsLeft.substring(1);
} else {
digitsLeft = "";
}
for (int i = 0; i < numLetters; i++) {
char c = letters.charAt(i);
mnemonicSoFar = mnemonicSoFar + Character.toString(c);
recursiveMnemonics(result, mnemonicSoFar, digitsLeft);
}
}
}
public static String digitLetters(char ch) {
String result = "";
switch (ch) {
case '2': result = "ABC";
break;
case '3': result = "DEF";
break;
case '4': result = "GHI";
break;
case '5': result = "JKL";
break;
case '6': result = "MNO";
break;
case '7': result = "PQRS";
break;
case '8': result = "TUV";
break;
case '9': result = "WXYZ";
break;
}
return result;
}
}
非常感谢任何帮助!
编辑:我移动了if语句,它在代码中编辑了digitsLeft字符串,并且稍微修改了我的结果。
答案 0 :(得分:0)
主要问题是在将mnemonicSoFar添加到结果后应该修复它。 例如:
您到达MAD并将其添加到结果中。之后,您需要使用mnemonicSoFar = MA和要添加的字母E进行同样的操作。请注意,您将mnemonicSoFar的最后一个字母取出。 所以你应该纠正你的代码:
for (int i = 0; i < numLetters; i++) {
char c = letters.charAt(i);
mnemonicSoFar = mnemonicSoFar + Character.toString(c);
recursiveMnemonics2(result, mnemonicSoFar, digitsLeft);
mnemonicSoFar = mnemonicSoFar.substring(0,mnemonicSoFar.length()-1);
}
如果您想改进编码风格,我会稍微重构您的代码。
private static void recursiveMnemonics(ArrayList<String> result, String mnemonicSoFar, String digitsLeft) {
if(digitsLeft.length() == 0) {
result.add(mnemonicSoFar);
return;
}
String letters = digitLetters(digitsLeft.charAt(0));
digitsLeft = digitsLeft.substring(1);
for(int i = 0; i < letters.length(); i++) {
mnemonicSoFar = mnemonicSoFar + letters.charAt(i);
recursiveMnemonics(result, mnemonicSoFar, digitsLeft);
mnemonicSoFar = mnemonicSoFar.substring(0,mnemonicSoFar.length()-1);
}
}
在我看来,它更具可读性。