JAVA实现一把逆向最大匹配

逆向最大匹配,顾名思义,根据你的字典词的最大长度,设置一个你接受文字的容器,然后在容器里每次把第一字去除。举个简单的例子,比如,“我是中国人,来自中国人民解放军”,我的字典中最大词如果也是15,那么我先匹配“我是中国人,来自中国人民解放军”是否在字典中,没有把“我”去掉,然后匹配“是中国人,来自中国人民解放军”也没有,以此类推,最后匹配到“中国人民解放军”。

先定义一个用来匹配数据的队列

public class Queue {
	private String str="";
	private String strOut = "";
	private int iStartPos = 0;
	private int iMaxNumber;

	
	public void put(char c){
		str += c;
	}
	
	public boolean pop(){
		iStartPos++;
		if(iStartPos == str.length()){
			iStartPos--;
			return false;
		}
		strOut=str.substring(iStartPos,str.length());
		return true;
	}

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		iMaxNumber = str.length();
		strOut = str;
		this.str = str;
	}
	public String getOutStr(){
		return strOut;
	}
	public int getStratPos(){
		return iStartPos;
	}
//	public void setiMaxNum(int iNum){
//		this.iMaxNumber = iNum;
//	}
}
定义一个对文件读取,以及是否存在于文件中
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
//import java.io.FileReader; 
import java.io.IOException; 
import java.io.InputStream; 
//import java.io.InputStreamReader; 
//import java.io.RandomAccessFile; 
import java.io.Reader; 

public class ReadFromFile {
	private String str;
	public String readFile(String fileName) {
		//String str = "";
		File file = new File(fileName);
		this.str = "";
		try
		{
			FileInputStream fis = new FileInputStream(fileName);
			int length;
			//String str = "";
			byte by[] = new byte[1024];
			while((length = fis.read(by)) != -1) {
				String strTemp = new String(by,0,length);
				this.str = this.str +  strTemp;
			}

			fis.close();
			
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		
		return this.str;
	
	}
	public boolean matched(String strWords){
		if(this.str.contains("\r\n"+strWords +"\r\n")){
			return true;
		}
		else
			return false;
		
	}

}
最后是主函数

import java.util.ArrayList;


public class UseReverse {

	public static void main(String[] args) {
		int iMaxSize = 1;
		int iBegPos = 0;
		String strSep = "";
		//int iWordMaxSize = 0;
		//String strInput;
		ArrayList aSepWord = new ArrayList();
		ReadFromFile rf = new ReadFromFile();
		String str=rf.readFile("F:\\微博相关\\字典\\123.TXT");
		//str=str.replaceAll("\\r\\n", "##");
		str="\r\n"+str;
		//System.out.println(str);
		ReadFromFile rf1 = new ReadFromFile();
		String strNeedSep = rf1.readFile("F:\\test.txt");
		System.out.println(strNeedSep);
		iMaxSize = strNeedSep.length();

		//iBegPos = iMaxSize - 15;
		while(iMaxSize != 0){
			iBegPos = iMaxSize - 15;
			if(iBegPos < 0){
				strSep = strNeedSep.substring(0,iMaxSize);
				iBegPos = 0;
			}
			else{
				strSep = strNeedSep.substring(iBegPos, iMaxSize);	
			}
			Queue qStr = new Queue();
			qStr.setStr(strSep);
			while(!rf.matched(qStr.getOutStr())){
				if(!qStr.pop()){
					break;
				}
			}
			System.out.println(qStr.getOutStr());
			aSepWord.add(qStr.getOutStr());
			//最后是一个词

			iMaxSize = iBegPos + qStr.getStratPos();
		}

	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值