﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-pokay</title><link>http://www.blogjava.net/chenxinppoo/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 10:44:33 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 10:44:33 GMT</pubDate><ttl>60</ttl><item><title>记事本的查找技术</title><link>http://www.blogjava.net/chenxinppoo/archive/2008/07/25/217323.html</link><dc:creator>ppoo</dc:creator><author>ppoo</author><pubDate>Thu, 24 Jul 2008 16:48:00 GMT</pubDate><guid>http://www.blogjava.net/chenxinppoo/archive/2008/07/25/217323.html</guid><wfw:comment>http://www.blogjava.net/chenxinppoo/comments/217323.html</wfw:comment><comments>http://www.blogjava.net/chenxinppoo/archive/2008/07/25/217323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxinppoo/comments/commentRss/217323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxinppoo/services/trackbacks/217323.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 终于做出完整的记事本，与windows的记事本相差不是很大。关于查找功能，当时心里一直想着用正则表达式去完成，也就是Pattern与Matcher类中的方法。可是查了半天，也就是能匹配正确的字符或字符串，可是方法的返回类型却是boolean的。这就没办法完成查找字符并定位文本的位置了。无奈之下，去网上搜索，可是没有找到任何有关的方法。当时心叫一个凉啊，所以我干脆自己想算法吧，拿出来和大家一起用。
<p>&nbsp; 首先你会将记事本的外观都做好。文本区域推荐使用JTextArea。假如这个文本的变量命名为jTextArea。接下来我开始写算法了。建立一个类FindMethod，专门用来计算查找的算法。</p>
<p>&nbsp; public class FindMethod {<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private NotePad note;//记事本的主类<br />
&nbsp;&nbsp;&nbsp; private String text;//定义从记事本文本区域传来的文本。<br />
&nbsp;&nbsp;&nbsp; private String mathe;//定义您所查询的字符串<br />
&nbsp;&nbsp;&nbsp; private int ltext=0;//文本的长度<br />
&nbsp;&nbsp;&nbsp; private int lmathe=0;//查询字符串的长度<br />
&nbsp;&nbsp;&nbsp; private char[] textc;//字符数组，保存文本的单个字符<br />
&nbsp;&nbsp;&nbsp; private char[] mathec;//字符数组，保存查询的单个字符<br />
<br />
&nbsp;&nbsp;&nbsp; private int[] index; //返回将要查找到的字符串或字符所在记事本文本区域的索引<br />
&nbsp;&nbsp;&nbsp; private int buttonsize; <br />
&nbsp;&nbsp;&nbsp; private boolean isBreak = false;//是否需要循环<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; public FindMethod(String text,String mathe,NotePad note) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text=text;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.mathe=mathe;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.note=note;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ltext=text.length();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lmathe=mathe.length();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mathec=new char[lmathe];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textc=new char[ltext];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index=new int[lmathe];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;ltext;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textc[i]=text.charAt(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;lmathe;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mathec[i]=mathe.charAt(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void findText() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int z=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(lmathe&gt;ltext) {//如果要查找的字符串的长度大于文本的长度则没有匹配的内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JOptionPane.showMessageDialog(note, "没有到找匹配的内容！");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;ltext-lmathe+1;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; z=i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;lmathe;j++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(mathec[j]==textc[z]) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isBreak=true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index[j]=z;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; z++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isBreak=false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index=new int[lmathe];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(isBreak==true)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int[] getIndex() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return index;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
}</p>
<p>关于findText()方法，其实就是查找算法的核心。比如文本为&#8220;12345&#8221;，你要查找的是&#8220;45&#8221;。那么肯定是需要查找4次，并且要进行两次比较（比较的内容是文本的'4'与查找的'4'，文本的'5' 与查找的'5'）。好了这些你知道了，那么你会发现其中有个规律。如果文本的长度是N，查找的文本的长度是M（N&gt;=M），则有需要进行(N-M)+1次查询，并且进行M次比较。如果比较成功的话那么isBreak就为true，并且让index这个数组依次赋上比较的M的长度的索引，并且数组的范围在&lt;M，如果其中的一次比较失败，那么isBreak就为false，让大体循环在执行，大体循环也就是有多少次查询。好了大体也就完事了，然后利用返回的index数组，index[0]和index[index.length()-1]分别代表要定位的记事本文本区域的开始和结束的索引值。然后利用jTextArea.select(index[0],index[index.length()-1]+1)方法来定位查找到的字符串。</p>
<p>&nbsp; 以上的方法可能有些麻烦，但是我感觉整体的思路还是可以的，适合与我们这些菜鸟。如果看不懂，就多看几遍，理解那个规律。再理解不了可以与我联系，谢谢。实例附件在<a href="http://www.itkay.com/?action=show&amp;id=29">http://www.itkay.com/?action=show&amp;id=29</a>可以下载到</p><img src ="http://www.blogjava.net/chenxinppoo/aggbug/217323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxinppoo/" target="_blank">ppoo</a> 2008-07-25 00:48 <a href="http://www.blogjava.net/chenxinppoo/archive/2008/07/25/217323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>