📄 defaultexpressionbuilder.java
字号:
package queries;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class DefaultExpressionBuilder implements IExpression{
/**
* the followings are the priority of the operator
* including "#","OR","AND","NOT","("
*/
private static final int SHAR_PRIORITY = 0;
private static final int PAREN_PRIORITY_R = 1;
private static final int OR_PRIORITY = 2;
private static final int AND_PRIORITY = 3;
private static final int NOT_PRIORITY = 3;
private static final int PAREN_PRIORITY_W = 4;
private static final int UNEXPECT = -1;
public DefaultExpressionBuilder(){
}
public Query buildExpression(String exp) {
exp = format(exp);
StringTokenizer tokenizer = new StringTokenizer(exp);
Deque<String> operatorStack = new ArrayDeque<String>();
Deque<Query> operandStack = new ArrayDeque<Query>();
operatorStack.push("#");
while(tokenizer.hasMoreTokens()){
String token = tokenizer.nextToken();
if(isOperator(token)){
int stackPriority = getStackPriority(operatorStack.peek());
int operatorPriority = getPriority(token);
if(operatorPriority > stackPriority){
operatorStack.push(token);
}
else{
while(operatorPriority <= stackPriority && ! operatorStack.isEmpty()){
String stackOperator = operatorStack.pop();
if(stackOperator.equals("and")){
Query right = operandStack.pop();
Query left = operandStack.pop();
operandStack.push(new AndQuery(left,right));
}
else if(stackOperator.equals("or")){
Query right = operandStack.pop();
Query left = operandStack.pop();
operandStack.push(new OrQuery(left,right));
}
else if(stackOperator.equals("not")){
Query query = operandStack.pop();
query.setStemmer(null);
operandStack.push(new NotQuery(query));
}
if(token.equals(")") && stackOperator.equals("(")){
break;
}
}
}
}
else{
operandStack.push(new ConcreteQuery(token));
}
}
return operandStack.pop();
}
/**
* @param operator
* @return
* return the priority of the opreator on the top of operation stack
*/
private int getStackPriority(String operator) {
if(operator.equals("(")){
return PAREN_PRIORITY_R;
}
else if(operator.equals("#")){
return SHAR_PRIORITY;
}
else{
return getPriority(operator);
}
}
/**
* @param operator
* @return
* get the priority of the operator
*/
private int getPriority(String operator){
if(operator.equals("or")){
return OR_PRIORITY;
}
else if(operator.equals("and")){
return AND_PRIORITY;
}
else if(operator.equals("not")){
return NOT_PRIORITY;
}
else if(operator.equals("(")){
return PAREN_PRIORITY_W;
}
else if(operator.equals(")")){
return PAREN_PRIORITY_R;
}
else if(operator.equals("#")){
return SHAR_PRIORITY;
}
else{
return UNEXPECT;
}
}
/**
* @param operator
* @return
* return true if it is an operator
*/
private boolean isOperator(String operator){
if(operator.equals("and") || operator.equals("or")
|| operator.equals("not") || operator.equals("(")
|| operator.equals(")") || operator.equals("#")){
return true;
}
return false;
}
/**
* @param exp
* @return
* format the expression to add spaces between the '(' and ')'
*/
private String format(String exp){
String[] array = exp.split("\\(");
StringBuffer buffer1 = new StringBuffer();
for(int i = 0;i < array.length; i++){
buffer1.append(" ( " + array[i]);
}
array = buffer1.toString().split("\\)");
StringBuffer buffer2 = new StringBuffer();
for(int i = 0;i < array.length; i++){
buffer2.append(array[i] + " ) ");
}
String result = buffer2.toString().toLowerCase() + " #";
return result;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -