终于做出完整的记事本,与windows的记事本相差不是很大。关于查找功能,当时心里一直想着用正则表达式去完成,也就是Pattern与Matcher类中的方法。可是查了半天,也就是能匹配正确的字符或字符串,可是方法的返回类型却是boolean的。这就没办法完成查找字符并定位文本的位置了。无奈之下,去网上搜索,可是没有找到任何有关的方法。当时心叫一个凉啊,所以我干脆自己想算法吧,拿出来和大家一起用。
首先你会将记事本的外观都做好。文本区域推荐使用JTextArea。假如这个文本的变量命名为jTextArea。接下来我开始写算法了。建立一个类FindMethod,专门用来计算查找的算法。
public class FindMethod {
private NotePad note;//记事本的主类
private String text;//定义从记事本文本区域传来的文本。
private String mathe;//定义您所查询的字符串
private int ltext=0;//文本的长度
private int lmathe=0;//查询字符串的长度
private char[] textc;//字符数组,保存文本的单个字符
private char[] mathec;//字符数组,保存查询的单个字符
private int[] index; //返回将要查找到的字符串或字符所在记事本文本区域的索引
private int buttonsize;
private boolean isBreak = false;//是否需要循环
public FindMethod(String text,String mathe,NotePad note) {
this.text=text;
this.mathe=mathe;
this.note=note;
ltext=text.length();
lmathe=mathe.length();
mathec=new char[lmathe];
textc=new char[ltext];
index=new int[lmathe];
for(int i=0;i<ltext;i++) {
textc[i]=text.charAt(i);
}
for(int i=0;i<lmathe;i++) {
mathec[i]=mathe.charAt(i);
}
}
public void findText() {
int z=0;
if(lmathe>ltext) {//如果要查找的字符串的长度大于文本的长度则没有匹配的内容
JOptionPane.showMessageDialog(note, "没有到找匹配的内容!");
}
else {
for(int i=0;i<ltext-lmathe+1;i++) {
z=i;
for(int j=0;j<lmathe;j++) {
if(mathec[j]==textc[z]) {
isBreak=true;
index[j]=z;
z++;
}
else{
isBreak=false;
index=new int[lmathe];
break;
}
}
if(isBreak==true)
break;
}
}
}
public int[] getIndex() {
return index;
}
}
关于findText()方法,其实就是查找算法的核心。比如文本为“12345”,你要查找的是“45”。那么肯定是需要查找4次,并且要进行两次比较(比较的内容是文本的'4'与查找的'4',文本的'5' 与查找的'5')。好了这些你知道了,那么你会发现其中有个规律。如果文本的长度是N,查找的文本的长度是M(N>=M),则有需要进行(N-M)+1次查询,并且进行M次比较。如果比较成功的话那么isBreak就为true,并且让index这个数组依次赋上比较的M的长度的索引,并且数组的范围在<M,如果其中的一次比较失败,那么isBreak就为false,让大体循环在执行,大体循环也就是有多少次查询。好了大体也就完事了,然后利用返回的index数组,index[0]和index[index.length()-1]分别代表要定位的记事本文本区域的开始和结束的索引值。然后利用jTextArea.select(index[0],index[index.length()-1]+1)方法来定位查找到的字符串。
以上的方法可能有些麻烦,但是我感觉整体的思路还是可以的,适合与我们这些菜鸟。如果看不懂,就多看几遍,理解那个规律。再理解不了可以与我联系,谢谢。实例附件在http://www.itkay.com/?action=show&id=29可以下载到
posted on 2008-07-25 00:48
ppoo 阅读(1005)
评论(0) 编辑 收藏