?? search.java
字號:
package src;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import org.tartarus.snowball.SnowballStemmer;
import org.tartarus.snowball.ext.englishStemmer;
public class Search {
/**
* @param args
*/
public Search() {
new Index();
}
public String search(String inString){
Stack<StringTokenizer> data = new Stack<StringTokenizer>();
Stack<String> operator = new Stack<String>();
operator.push("#");
String output = "";
int countparentheses = 0;//in order to check the formula
StringTokenizer test = new StringTokenizer(inString," ()#",true);//in order to check the formula
/*
* exception handler for wrong formula.some of exception handlers are enbeded in the mian method program
*/
while(test.hasMoreTokens()){
String o = test.nextToken();
if(o.equals("("))
countparentheses ++;
else if (o.equals(")"))
countparentheses --;
}
if (countparentheses != 0){
return ("The formula is not correct,please check your input \"" + inString + "\"");
}
//alter and compute
StringTokenizer tokens = new StringTokenizer(inString + "#"," ()#",true);
if (tokens.countTokens() == 1){
atomicQuery(tokens.nextToken());
}
else {
while(tokens.hasMoreTokens()){
String temp = tokens.nextToken();
/*
* deal with the operant
*/
if(!temp.equals("AND") && !temp.equals("OR") && !temp.equals("NOT") && !temp.equals("(") && !temp.equals(")") && !temp.equals("#") && !temp.equals(" ")){
data.push(atomicQuery(temp));
output += temp + " ";
}
/*
* deal with the bracket
*/
else if(temp.equals( ")")){
for(String o =operator.pop();!operator.isEmpty() && !o.equals("(");o = operator.pop()){
if (o.equals("AND")){
StringTokenizer behind = data.pop();
StringTokenizer ahead = data.pop();
data.push(and(ahead,behind));
}
else if (o.equals("OR")){
StringTokenizer behind = data.pop();
StringTokenizer ahead = data.pop();
data.push(or(ahead,behind));
}
else if (o.equals("NOT")){
StringTokenizer behind = data.pop();
data.push(not(behind));
}
output += o + " ";
o = operator.pop();
}
}
else if(temp.equals("(")){
operator.push(temp);
}
/*
*deal with the operator
*/
else{
if(!operator.isEmpty()){
String o = operator.pop();
while(true){
if (operator.isEmpty() || icp(temp) > isp(o)){
operator.push(o);
break;
}
if (o.equals("AND")){
StringTokenizer behind = data.pop();
StringTokenizer ahead = data.pop();
data.push(and(ahead,behind));
}
else if (o.equals("OR")){
StringTokenizer behind = data.pop();
StringTokenizer ahead = data.pop();
data.push(or(ahead,behind));
}
else if (o.equals("NOT")){
StringTokenizer behind = data.pop();
data.push(not(behind));
}
output += o + " ";
o = operator.pop();
}
}
operator.push(temp);
}
}
}
String result = "";
StringTokenizer endTokens = data.pop();
while (endTokens.hasMoreTokens()){
result += endTokens.nextToken();
}
return result;
// return "The correct answer of " + inString + " is\n" + output + "= " + data.pop() ;
}
/*
* in stack priority
*/
private int isp(String sign){
if(sign.equals("AND") || sign.equals("OR") || sign.equals("NOT"))
return 3;
else if(sign.equals("("))
return 1;
else if(sign.equals(")"))
return 4;
else
return 0;
}
/*
* in coming priority
*/
private int icp(String sign){
if (sign.equals("AND") || sign.equals("OR") || sign.equals("NOT"))
return 2;
else if (sign.equals("("))
return 4;
else if (sign.equals(")"))
return 1;
else
return 0;
}
private StringTokenizer and(StringTokenizer ahead,StringTokenizer behind){
String result = "";
TreeSet<String> former = new TreeSet<String>();
while (ahead.hasMoreTokens()){
former.add(ahead.nextToken());
}
while (behind.hasMoreTokens()){
String token = behind.nextToken();
if (former.contains(token)){
result += token + "|";
}
}
return new StringTokenizer(result,"|");
}
private StringTokenizer or(StringTokenizer ahead,StringTokenizer behind){
String result = "";
TreeSet<String> former = new TreeSet<String>();
while (ahead.hasMoreTokens()){
String token = behind.nextToken();
former.add(token);
result += token + "|";
}
while (behind.hasMoreTokens()){
String token = behind.nextToken();
if (!former.contains(token)){
result += token + "|";
}
}
return new StringTokenizer(result,"|");
}
private StringTokenizer not(StringTokenizer behind){
String result = "";
File directory = new File("test-files");
File[] files = directory.listFiles();
TreeSet<String> latter = new TreeSet<String>();
while (behind.hasMoreTokens()){
latter.add(behind.nextToken());
}
for (int i = 0;i < files.length;i ++){
String fileName = files[i].getPath().substring(files[i].getPath().indexOf("\\") + 1);
if (!latter.contains(fileName)){
result += fileName + "|";
}
}
return new StringTokenizer(result,"|");
}
private StringTokenizer atomicQuery(String keyword){
StringTokenizer line = null;
try{
BufferedReader br = new BufferedReader(new FileReader("index"));
line = new StringTokenizer(br.readLine(),":|");
SnowballStemmer stemmer = new englishStemmer();
stemmer.setCurrent(keyword.toLowerCase());
stemmer.stem();
if (stemmer.getCurrent().equalsIgnoreCase(line.nextToken()));
}catch(IOException e){
System.out.println(e);
}
return line;
}
public static void main(String args[]){
Search s = new Search();
System.out.println(s.search("exception"));
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -