概述:前面已经提到,基础框架Trade-Federation默认就支持很多命令。在控制台输入一组命令,肯定要经过解析,然后去执行的过程。基础框架中对于命令有一个单独的数据结构去组织,并不是通过if-else
这样去比较string的。比如:前面提到的命令:run cts --plan cts
,这个命令中,run才是命令,而剩下的都属于参数;再比如:list configs
,还有命令的简写,list
可以简写为l
等等。
1.Trie
Trie树又称为字典树,又叫做单词查找树。主要用于文本检索以及词频统计等。有一个很大的优点就是能够减少无效匹配的次数。
实现方式:从root节点开始,每个节点存储一个字符。每次在向树中存储字符串的时候,根据单词中字符的顺序,逐个向树的每层去存放,如果该层已经有该字符,就去取下一个字符。
例:现在有一些单词:t,tx,txt,to,txa,too,a,b
构建成为字典树如图所示
看这个图就能一目了然,因为共前缀,能够加快查找效率,且查找以及构建的过程可以同时进行。
2.RegexTrie
RegexTrie是在这个基础框架中的一个工具类,实现跟上面的Trie很像,但是还是有区别的:区别就在于RegexTrie的节点上存放的是正则表达式,也就是支持的命令的正则表达式。
基础框架中支持两种命令:定长命令以及变长命令。
定长命令:list configs
– 固定的字符串(包括简写)
变长命令:run cts --plan cts
– 后带变长参数
树的结构:
接下来看下实现:
首先是这个类中的变量:
private V mValue = null;
private Map<CompPattern, RegexTrie<V>> mChildren = new LinkedHashMap<CompPattern, RegexTrie<V>>();
2.1 put
public V put(V value, String... regexen) {
// 这个地方直接就把输入的正则表达式的参数解析封装为CompPattern
// CompPattern内部有一个Pattern变量,不过自己还实现了一些Object中的方法
List<CompPattern> pList = new ArrayList<CompPattern>(regexen.length);
for (String regex : regexe