我想制作一个程序,它采用像234这样的一组数字,此时,打印出手机键盘上可能出现的每个字母组合。
(1 - 没什么,2 - abc,3-def等等)
我目前有:
import java.util.*;
public class testCombo {
static String str="217";
static ArrayList<String> list=new ArrayList<String>();
static void addLet(String seg){
if(seg.length()==str.length()){
list.add(seg);
return;
}
char currentChar=str.charAt(seg.length());
if(currentChar==1 || currentChar==0)
{
String str1=seg+" ";
addLet(str1);
}
if(currentChar=='2'){
addLet(seg+"a");
addLet(seg+"b");
addLet(seg+"c");
}
else if(currentChar=='3'){
addLet(seg+"d");
addLet(seg+"e");
addLet(seg+"f");
}
else if(currentChar=='4'){
addLet(seg+"g");
addLet(seg+"h");
addLet(seg+"i");
}
else if(currentChar=='5'){
addLet(seg+"j");
addLet(seg+"k");
addLet(seg+"l");
}
else if(currentChar=='6'){
addLet(seg+"m");
addLet(seg+"n");
addLet(seg+"o");
}
else if(currentChar=='7'){
addLet(seg+"p");
addLet(seg+"q");
addLet(seg+"r");
addLet(seg+"s");
}
else if(currentChar=='8'){
addLet(seg+"t");
addLet(seg+"u");
addLet(seg+"v");
}
else if(currentChar=='9'){
addLet(seg+"w");
addLet(seg+"x");
addLet(seg+"y");
addLet(seg+"z");
}
}
public static void main(String[] args){
addLet("");
for(String str:list) //Sets str to each value in list during each iteration
System.out.println(str);
}
}
作为我的代码,因为我们应该使用递归编程,但我不能让它适用于1和0。 (这只是一个练习课,我有另一个允许来自用户的输入,它已经验证它只包含数字)
这种查找方法会将每个组合计数打印为递归吗?
答案 0 :(得分:1)
是的,它是递归的(它通过调用自身来工作),但它不必要地冗长。您可以跳过临时变量,从而节省大量空间,并使其更具可读性。我花了一些时间来了解为什么在每种情况下你都有几个字符串变量:
if(currentChar==1 || currentChar==0)
{
addLet(seg+" ");
}
if(currentChar=='2'){
addLet(seg+"a");
addLet(seg+"b");
addLet(seg+"c");
} ...
WRT 1和0,你应该将currentChar与'1'
和'0'
进行比较,而不是1
和0
。
答案 1 :(得分:0)
您可以使用数字到候选字母的映射来简化代码并减少出错的几率:
import java.util.*;
import static java.util.Arrays.asList;
public class TestCombo {
private static Map<Character, List<Character>> lettersByDigit =
new HashMap<Character, List<Character>>() {{
put('0', asList(' '));
put('1', asList(' '));
put('2', asList('a', 'b', 'c'));
put('3', asList('d', 'e', 'f'));
// and so on - add all candidates per digit in this fashion
}};
private static List<String> candidates = new Vector<String>();
private static void enumerate(String digits, String prefix) {
if (prefix.length() == digits.length()) {
candidates.add(prefix);
return;
}
char nextDigit = digits.charAt(prefix.length());
for (Character nextLetter : lettersByDigit.get(nextDigit)) {
enumerate(digits, prefix + nextLetter.toString());
}
}
public static void main(String[] args){
enumerate("217", "");
for(String candidate : candidates) {
System.out.println(candidate);
}
}
}
请注意,这未经过测试,但希望您明白这一点。