zoukankan      html  css  js  c++  java
  • 关于字符串检索、关键词的搜索问题:已搜索过的部分不会再被纳入下次搜索的范围内

    问题描述:

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

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

  • 相关阅读:
    Git 上传本地项目
    virtual和override
    ASP .NET依赖注入理解
    dotnet不是内部或外部的命令,也不是可运行的程序或批处理文件
    C++ 简单选择排序
    C++ 排序
    iOS UIDynamic
    iOS Modal
    C++ 折半查找
    C++ 二叉链表
  • 原文地址:https://www.cnblogs.com/Wfei/p/3248865.html
Copyright © 2011-2022 走看看