技术开发 频道

SOA 治理案例

    【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里边以后,形成了一个如下的二叉树。

    这里就可以看得很清楚了。

    在根节点下边,没有进行排序,而在底下的每个节点下,都是按照要检索的字符串顺序排列的二叉检索树,因此不是一种标准的二叉检索树,而是字符顺序相关的检索。

0
相关文章