个人感觉有点类似于有限状态机
package com.smart.enumcompareto.test;
import com.smart.enumcompareto.test.TernarySearchTrie.TSTNode;
/**
* 语法树匹配到的结果,记录最终节点和最终节点的index
*
* @author dell
*
*/
public class MatchRet {
private int index;
private TSTNode node;
public MatchRet(TSTNode node,int index){
this.index=index;
this.node=node;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public TSTNode getNode() {
return node;
}
public void setNode(TSTNode node) {
this.node = node;
}
public String toString(){
return node.data;
}
}
package com.smart.enumcompareto.test;
public enum TokenType {
Unknown,
Basic,
Suffix,
Start,
End
}
package com.smart.enumcompareto.test;
import java.util.ArrayList;
/**
* 语法树的测试
*
* @author dell
*
*/
public class TernarySearchTrie {
public final class TSTNode {
public String data = null;
protected TSTNode loNode;
protected TSTNode eqNode;
protected TSTNode hiNode;
protected TokenType splitchar;
public TSTNode(TokenType type) {
this.splitchar = type;
}
}
public TSTNode rootNode;
public TSTNode add(ArrayList<TokenType> word) {
if (null == word) {
throw new NullPointerException("空指针异常");
}
int charIndex = 0;
if (null == rootNode) {
rootNode = new TSTNode(word.get(0));
}
TSTNode currentNode = rootNode;
while (true) {
int charComp = word.get(charIndex).compareTo(currentNode.splitchar);
if (charComp == 0) {
charIndex++;
if (charIndex == word.size()) {
return currentNode;
}
if (null == currentNode.eqNode) {
currentNode.eqNode = new TSTNode(word.get(charIndex));
}
currentNode = currentNode.eqNode;
} else if (charComp < 0) {
if (null == currentNode.loNode) {
currentNode.loNode = new TSTNode(word.get(charIndex));
}
currentNode = currentNode.loNode;
} else {
if (null == currentNode.hiNode) {
currentNode.hiNode = new TSTNode(word.get(charIndex));
}
currentNode = currentNode.hiNode;
}
}
}
protected TSTNode getNode(ArrayList<TokenType> word) {
if (null == word) {
return null;
}
int len = word.size();
if (len == 0)
return null;
TSTNode currentNode = rootNode; // 匹配过程中的当前节点的位置
int charIndex = 0; // 表示当前要比较的字符在Key中的位置
TokenType cmpChar = word.get(charIndex);
int charComp;
while (true) {
if (currentNode == null) {// 没找到
return null;
}
charComp = cmpChar.compareTo(currentNode.splitchar);
if (charComp == 0) {// 相等往下走
charIndex++;
if (charIndex == len) {// 找到了
return currentNode;
} else {
cmpChar = word.get(charIndex);// 词往下走
}
currentNode = currentNode.eqNode;
} else if (charComp < 0) {// 小于往左走
currentNode = currentNode.loNode;
} else {// 大于往右走
currentNode = currentNode.hiNode;
}
}
}
public void tag(ArrayList<TokenType> tokens) {
if (tokens == null || rootNode == null) {
return;
}
for (int i = 0; i < tokens.size();) {
MatchRet ret = matchLong(tokens, i);
if (null != ret) {
System.out.println(ret.toString());
i = ret.getIndex();
} else {
System.out.println("null");
i++;
}
}
}
public MatchRet matchLong(ArrayList<TokenType> tokens, int offset) {
if (tokens == null || rootNode == null) {
return null;
}
MatchRet ret = null;
TSTNode currentNode = rootNode;
int index = offset;
while (currentNode != null) {
int charComp = tokens.get(index).compareTo(currentNode.splitchar);
if (charComp == 0) {
index++;
if (currentNode.data != null) {
ret = new MatchRet(currentNode, index);
}
if (index == tokens.size()) {
return ret;
}
currentNode = currentNode.eqNode;
} else if (charComp < 0) {
currentNode = currentNode.loNode;
} else {
currentNode = currentNode.hiNode;
}
}
return ret;
}
public static void main(String[] args) {
//testTag();
testAddGet();
}
private static void testAddGet(){
TernarySearchTrie tree=new TernarySearchTrie();
ArrayList<TokenType> list=new ArrayList<TokenType>();
list.add(TokenType.Start);
list.add(TokenType.Suffix);
list.add(TokenType.Basic);
list.add(TokenType.End);
TSTNode node=tree.add(list);
node.data="我是start-suffix-basic-end组合";
TSTNode ret=tree.getNode(list);
if(ret==null){
System.out.println("未匹配到");
}
else{
System.out.println(ret.data);
}
}
private static void testTag() {
TernarySearchTrie tree = new TernarySearchTrie();
ArrayList<TokenType> list = new ArrayList<TokenType>();
list.add(TokenType.Basic);
list.add(TokenType.Suffix);
TSTNode node = tree.add(list);
node.data = "我是basic-suffix组合";
list = new ArrayList<TokenType>();
list.add(TokenType.Unknown);
list.add(TokenType.Suffix);
TSTNode node_1 = tree.add(list);
node_1.data = "我是unknown-suffix组合";
list = new ArrayList<TokenType>();
list.add(TokenType.Start);
list.add(TokenType.Basic);
list.add(TokenType.Suffix);
list.add(TokenType.Unknown);
list.add(TokenType.Suffix);
list.add(TokenType.End);
tree.tag(list);
}
}