posts - 1,  comments - 0,  trackbacks - 0
   终于做出完整的记事本,与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)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(1)

随笔档案(1)

搜索

  •  

最新评论