关于字符串检索、关键词的搜索问题:已搜索过的部分不会再被纳入下次搜索的范围内

问题描述:

首先来看一下,类似的代码程序:

有一个String类型的字符串str1 = "ababababab",还有另一个String类型的字符串str2 = "aba",那么编写程序,来检索在str1中,可以检索到【几个】str2,在初次接触到这个问题时,编写的方法代码如下:

 1 /**
 2      * 搜索索引处理程序
 3      */
 4     private void searchString()
 5     {
 6         String temp;
 7         String indexS = "";
 8         for (int i = 0; i <= (str1.length() - str2.length()); i++)
 9         {
10             temp = str1.substring(i,i+str2.length());
11             if (temp.equals(str2))
12             {
13                 indexS = indexS + i + ",";
14             }
15         }
16         showIndexS(indexS);
17     }

运行后,输出的结果是:0,2,4,6,
也就是说,在str1字符串中共找到含有str2字符串的索引有0,2,4,6,共有【4个】,在这个检索的方法中,是逐个字符进行检测的,看上去似乎没什么问题

但是,在查看了jdk文档、搜索网上的解释后,发现这种检索的逻辑是完全不符合目前的检索规则的,因为,现在的搜索引擎在对输入的关键字到源中进行检索时,不会在已检索过的字符中检索,比如:str1 = "ababababab",str2 = "aba",要在str1中查找有几个str2,那么搜索引擎是:在第一次在str1中找到str2时,即索引是0,在进行下次往后的检索,是从索引为3的地方开始,即aba【b】ababab中的b处,而不是a【b】abababab中b处,它会跳过str2长度的索引,不会对之前检查的ba再纳入检测,因此得到结果就是:0,4,即只检测到两个

然后,再去jdk中找根据:其中在String类中有个replace()的方法,方法的作用就是替换源字符串中特定字符为指定的字符,验证代码如下:

1         String str = "ababababab";
2         String str1 = "c";
3         str = str.replace("aba", str1);            //替换str中aba为c
4         System.out.println(str);

System打印出来的结果就是:cbcbab,也就是说:在索引0处检测到了aba,替换成了c,然后再从索引3处进行检测,而不是索引1处,以此类推

总结:

由此,可以看出来在编写searchString()进行字符串检测时,检测到了就应该跳到+目标字符串长度的索引位置,而不是简单的当前索引+1

搜索引擎如此,jdk也是如此,这也就是应该遵循的规则,除非你有什么特殊的需要!

posted @ 2013-08-09 18:11  魏飞  阅读(358)  评论(0编辑  收藏  举报
你见

或者不见我
我就在那里
不悲不喜
你念

或者不念我
情就在那里
不来不去
你爱

或者不爱我
爱就在那里
不增不减
你跟

或者不跟我
我的手就在你的手里
不舍不弃
来我怀里
或者
让我住进你的心里
默然

相爱
寂静

喜欢
Mr Frank