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 閱讀(1009) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2008年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆檔案(1)

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 乐至县| 旺苍县| 重庆市| 敦煌市| 郁南县| 桦甸市| 嘉禾县| 铁岭市| 喀喇沁旗| 辰溪县| 岑巩县| 青铜峡市| 和林格尔县| 济南市| 莱西市| 苏州市| 历史| 孝义市| 视频| 西充县| 宁海县| 延边| 江门市| 太仆寺旗| 门头沟区| 凭祥市| 北宁市| 郴州市| 磴口县| 玉林市| 凤山县| 农安县| 金溪县| 渝北区| 白沙| 五原县| 新绛县| 浦东新区| 昆明市| 咸阳市| 福泉市|