我在学校的 Java 作业上遇到了一些麻烦。我们需要编写一个程序来进行某些手机使用的 T9 Word 文本预测。它应该接受用户输入的数字,找到与这些数字对应的每个可能的字母组合,在字典中搜索每个可能的组合,并显示在字典中找到的组合。这个程序的大部分内容都是教授为我们编写的,我只需要填写进行可能性组合的 predictText 方法。它通过调用另一种使用递归二进制搜索的方法进行搜索,虽然我很确定我的搜索方法运行良好,但我也必须自己填写。这是我的 predictText 方法,其中参数“letter”是当前正在处理的字母,
public static void predictText(String letter, String input, ArrayList<String> wordMatches)
{
String[] two = new String[] {"a", "b", "c"};
String[] three = new String[] {"d", "e", "f"};
String[] four = new String[] {"g", "h", "i"};
String[] five = new String[] {"j", "k", "l"};
String[] six = new String[] {"m", "n", "o"};
String[] seven = new String[] {"p", "q", "r", "s"};
String[] eight = new String[] {"t", "u", "v"};
String[] nine = new String[] {"w", "x", "y", "z"};
char firstDigit;
String finalWord = "";
finalWord += letter;
if (input.equals(""))
{
int lookup = search(finalWord.trim());
if (lookup != -1)
{
wordMatches.add(allWords[lookup]);
}
}
else
{
firstDigit = input.charAt(0);
input = input.substring(1);
if (firstDigit == '2')
{
for (int i = 0; i < two.length; i++)
{
letter = two[i];
predictText(letter, input, wordMatches);
}
}
else if (firstDigit == '3')
{
for (int i = 0; i < three.length; i++)
{
letter = three[i];
predictText(letter, input, wordMatches);
}
}
// And so forth, up to 9
}
}
我得到的结果是它只显示单个字母,它似乎没有将字母组合成单词并在字典中搜索那些完整的单词。以防万一需要进一步解释,这里是分配说明:
“您将从输入字符串中取出第一个数字,然后再次调用 predictText,对于第一个数字可以表示的每个可能的字母一次,将字母添加到变量单词中,并从输入中删除第一个数字。例如, 如果第一次进入 predictText 单词为空且输入为“4663”,您将递归调用 predictText 3 次: • 单词为“g”,输入为“663”, • 单词为“h”,输入为“663” ”, • 单词为“i”,输入为“663” 该过程将重复,并且您将继续构建单词(因此对于单词为“g”且下一个数字为6,您将递归调用“gm ”、“gn”和“go”,输入为“63”)一旦没有更多的输入需要递归处理,你就达到了一个基本情况,然后调用搜索方法来查看你生成的单词是否存在于字典。如果是的话,将其添加到 wordMatches 列表中。”
编辑:我还认为我应该包括我的搜索方法代码,以防万一它确实导致了我的问题。
public static int search(String key)
{
return search(allWords, key, 0, allWords.length-1);
}
public static int search(String[] dictionary, String key, int start, int end)
{
int middle = start + ((end - start) / 2);
int index = -1;
if (start > end)
{
index = -1;
}
else if (key.compareToIgnoreCase(dictionary[middle]) == 0)
{
index = middle;
}
else if (key.compareToIgnoreCase(dictionary[middle]) < 0)
{
index = search(dictionary, key, start, middle - 1);
}
else
{
index = search(dictionary, key, middle + 1, end);
}
return index;
}