2013-04-16 64 views
4

我是新来的java,我想创建一个非常简单的“单词完成”程序。我将在字典文件中读取并递归地将这些字添加到一个节点数组(26号)中。我相信我已经成功地做到了这一点,但我不知道如何通过并打印比赛。为了测试,我现在简单地通过调用函数插入2个单词。一旦一切正常,我将添加方法来读取文件并从文字中删除垃圾。打印树组件

例如:如果单词“test”和“tester”在树中,并且用户输入“tes”,则应该显示“test”和“tester”。

如果有人可以请告诉我如何通过打印匹配(如果有的话),我会非常感激。完整的代码如下。

这里谢谢

回答

3

你实现什么is called"trie"。你可能想看看现有的实现。

你用来存储子节点的称为哈希表,你可能想要使用标准实现并且避免自己实现它,除非你有非常非常特殊的理由去做。你的实现有一些限制(例如字符范围)。


我想,你的代码中有方法has了一个错误:

... 
else if (letter[val].flag==true || word.length()==1) { 
    return true; 
} 

如果该方法的目的是如果有与word开始那么它不应该检查flag字符串返回true。如果仅在完全匹配时才返回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()); 
      } 
     } 
    } 
} 
+0

感谢您的回复!我会放弃它。至于我的方法中的错误,为什么它必须返回真正的完全匹配?如果输入“tes”,它是否也会返回true?是的,它不是确切的单词,但是当用户输入“tes”时,它应该显示以该单词开始的所有内容 – Teddy13

+0

@ Teddy13,我不知道该方法打算做什么,但是如果它应该对' tes',那么它不应该检查'flag'是否为真(因为'flag'没有'''''Node'实例。看看我的'Node._match' impl,它做了什么你想要(只是返回一个节点,而不是布尔值,以备后用)。 – khachik

-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 
} 
+1

我想学习如何做到这一点与数组和树结构,因为我只是学习java。谢谢。你知道我能用这两样东西做到吗? – Teddy13