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

问题描述:

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

有一个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也是如此,这也就是应该遵循的规则,除非你有什么特殊的需要!

你可能感兴趣的:(字符串)