我是java新手,我想创建一个非常简单的“单词完成”程序。我将在字典文件中读取并递归地将单词添加到Node数组(大小为26)。我相信我已经成功地做到了这一点,但我不确定如何通过打印比赛。为了测试,我只是通过调用函数来插入2个单词。一切正常后,我将添加方法来读取文件并从单词中删除垃圾。
例如:如果单词“test”和“tester”在树内且用户输入“tes”,则应显示“test”和“tester”。
如果有人可以告诉我如何通过并打印比赛(如果有的话),我会非常感激。完整代码如下。
谢谢
答案 0 :(得分:3)
您实施的内容is called "trie"。您可能希望查看现有的实现。
您用于存储子节点的内容称为哈希表,您可能希望使用标准实现并避免自己实现它,除非您有非常具体的理由这样做。您的实现有一些限制(例如字符范围)。
我认为,您的代码在方法has
中存在错误:
...
else if (letter[val].flag==true || word.length()==1) {
return true;
}
如果存在以word
开头的字符串,则该方法旨在返回true,则不应检查flag
。如果仅在完全匹配时必须返回true,则不应检查word.length()
。
最后,解决你的问题:不是最优的,但最简单的解决方案是创建一个方法,它接受一个字符串并返回一个匹配该字符串的节点和一个组成节点中所有单词的方法。这样的事情(未经测试):
class Tree {
...
public List<String> matches(CharSequence prefix) {
List<String> result = new ArrayList<>();
if(r != null) {
Node n = r._match(prefix, 0);
if(n != null) {
StringBuilder p = new StringBuilder();
p.append(prefix);
n._addWords(p, result);
}
}
return result;
}
}
class Node {
...
protected Node _match(CharSequence prefix, int index) {
assert index <= prefix.length();
if(index == prefix.length()) {
return this;
}
int val = prefix.charAt(index) - 'a';
assert val >= 0 && val < letter.length;
if (letter[val] != null) {
return letter[val].match(prefix, index+1);
}
return null;
}
protected void _addWords(StringBuilder prefix, List<String> result) {
if(this.flag) {
result.add(prefix.toString());
}
for(int i = 0; i<letter.length; i++) {
if(letter[i] != null) {
prefix.append((char)(i + 'a'));
letter[i]._addWords(prefix, result);
prefix.delete(prefix.length() - 1, prefix.length());
}
}
}
}
答案 1 :(得分:-1)
也许这里有一个远景,但为什么不在这里尝试正则表达式呢?据我所知,你想将单词与单词列表匹配:
List<String> getMatches(List<String> list, String regex) {
Pattern p = Pattern.compile(regex);
ArrayList<String> matches = new ArrayList<String>();
for (String s:list) {
if (p.matcher(s).matches()) {
matches.add(s);
}
}
return matches
}