【IT168技术文档】今天本来是要做一个全站程序的替换,想到了前两天看到的SimpleStringSearch,就看了一下,结果全站程序替换没有做成,把这个研究了一下。
我用dox作了一个chm的文档(点击下载),后来发现光看文档是没有用的。因为我不知道其中的数据结构组织,原来也没有做过相关的方面内容。
于是我修改了一下源代码,打印了一下信息,终于搞清楚他的数据组织。
首先看一下类的继承关系,重要的数据结构就是,检索树结构。其中SearchTreeNode是接口,AbstractSearchTreeNode是下边继承的抽象类,具体的实现包括ExactSearchTreeNode,SingleWildcardSearchTreeNode和WildcardSearchTreeNode。以成员变量形式存储的数据主要存储在AbstractSearchTreeNode,因此我添加的打印代码,也放在了AbstractSearchTreeNode中。
public String toString()...{
StringBuffer buffer = new StringBuffer();
![]()
buffer.append("Depth:"+depth+"\t");
buffer.append("Children num:"+children.size());
buffer.append("\t"+"Character:"+character+"\n");
depth++;
for(int i=0 ; i<children.size(); i++)...{
SearchTreeNode stn = children.get(i);
buffer.append(stn.toString());
}
depth--;
return buffer.toString();
}
depth是一个static的记录层次的int变量。
下面是测试代码:
public static void main(String[] args) ...{
try...{
StringSearch s = new StringSearch();
MyHitHandler handler = new MyHitHandler();
s.addSearchTerm("do", handler);
s.addSearchTerm("Java", handler);
s.addSearchTerm("ava",handler);
s.addSearchTerm("da",handler);
System.out.println(s.getRoot().to2String());
// s.getRoot().printString();
s.search("Do, or do not. Except in Java. -- Yoda");
System.out.println("Count is: " + handler.getCount());
}
catch(IOException ex)...{
ex.printStackTrace();
}
}
把这几项弄到StringSearch里边以后,形成了一个如下的二叉树。

这里就可以看得很清楚了。
在根节点下边,没有进行排序,而在底下的每个节点下,都是按照要检索的字符串顺序排列的二叉检索树,因此不是一种标准的二叉检索树,而是字符顺序相关的检索。