⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 defaultexpressionbuilder.java

📁 一个用于搜索本地文件内容的小型搜索引擎
💻 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 + -