博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于字符串检索、关键词的搜索问题:已搜索过的部分不会再被纳入下次搜索的范围内...
阅读量:4983 次
发布时间:2019-06-12

本文共 1422 字,大约阅读时间需要 4 分钟。

问题描述:

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

有一个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为c4         System.out.println(str);

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

总结:

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

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

转载于:https://www.cnblogs.com/Wfei/p/3248865.html

你可能感兴趣的文章
poj 2000 Gold Coins
查看>>
开通博客了
查看>>
炮兵阵地
查看>>
BZOJ 1863: [Zjoi2006]trouble 皇帝的烦恼( 二分答案 )
查看>>
try catch
查看>>
slf4j
查看>>
Orcal 给表增加一个自增的ID
查看>>
C#语言和SQL Server数据库技术_程序数据集散地:数据库
查看>>
ES6学习之变量的解构赋值
查看>>
PHP 生成图片缩略图函数
查看>>
Boost Bimap示例
查看>>
ESLint 使用入门
查看>>
流水作业调度
查看>>
涨姿势系列之——内核环境下内存映射函数
查看>>
遍历数组批量更新数组里元素的某一项属性
查看>>
github 收藏项目的方法
查看>>
九的余数
查看>>
北京师范大学第十五届ACM决赛-重现赛K Keep In Line ( 字符串模拟实现)
查看>>
(转)C# — WinForm 消息框的使用
查看>>
时间管理(转)
查看>>