GVKun编程网logo

为什么String.indexOf()不使用KMP?(为什么string不用new)

14

在本文中,我们将为您详细介绍为什么String.indexOf的相关知识,并且为您解答关于不使用KMP?的疑问,此外,我们还会提供一些关于C#中indexOf、lastIndexOf、subStrin

在本文中,我们将为您详细介绍为什么String.indexOf的相关知识,并且为您解答关于不使用KMP?的疑问,此外,我们还会提供一些关于C# 中indexOf、lastIndexOf、subString方法的理解、C#中String类的几个方法(IndexOf、LastIndexOf、Substring)、delphi – TStringList.IndexOf:indexof中的通配符?、IndexOf、LastIndexOf、Substring的用法的有用信息。

本文目录一览:

为什么String.indexOf()不使用KMP?(为什么string不用new)

为什么String.indexOf()不使用KMP?(为什么string不用new)

我阅读的源代码,java.lang.String很惊讶地发现它String.indexof()不使用Knuth–Morris–Pratt算法?众所周知,KMP更有效。那么为什么不使用它String.indexOf()呢?

我周围的人告诉我,对于短字符串KMP来说已经足够了,但是如果您需要性能并且打算与大字符串一起使用,则不是一个好选择。但是他没有告诉我细节。

所以,这是我的问题:

  1. 为什么我们不使用KMP String.indexOf()
  2. 为什么KMP对于大字符串不是一个好选择?

答案1

小编典典

KMP在最坏情况下具有更好的性能,但实际上需要进行一些前期计算(以生成偏移表)。这 需要一个初始的内存分配,这也可能会影响性能。

对于(大概)在较短字符串中进行搜索的常见用例,这实际上可能比原始实现要慢。

这与以下事实捆绑在一起:对于非常庞大的数据集,您可能将使用更专业的数据结构,而不是简单的String方法,这意味着增加的实现(可能还有运行时)成本不值得投资。

请注意,由于未指定实际算法,因此在将来的Java版本中这 可能会 更改。

C# 中indexOf、lastIndexOf、subString方法的理解

C# 中indexOf、lastIndexOf、subString方法的理解

一、indexOf()

indexOf("\\"):返回"\\"字符在此实例中第一个出现的索引位置,实例的下标是从0开始,如果未找到则返回-1.

indexOf("\\", 7):返回在此实例中从下标7开始的,第一次出现"\\"的位置,如果未找到返回-1.

二、lastIndexOf()

lastIndexOf("\\"):返回"\\"在此实例中最后一个出现的索引位置。即从右向左搜索,第一次出现的"\\"的位置,如果未找到则返回-1.

lastIndexOf("\\", 7):返回在此实例中从下标0开始到下标7结束的这一段子串中,最后一次出现"\\"的位置 。即从右向左搜索,第一次出现的"/"的位置,如果未找到则返回-1.

三、subString()

Substring:截取字符串。Substring(7,2)表示从下标7开始,截取长度为2的字符串,Substring(7)表示从下标7开始,一直截取到字符串末尾。

 

PS:indexOf和lastIndexOf的区别就搜索的方向不一样,indexOf是从左向右,lastIndexOf是从右向左,尽管搜索方向不一样,但是字符下标依然从左向右加1,从0开始。

四、例子:

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string FilePath = "D:\\files\\small.txt";
            Console.WriteLine(FilePath);

            int a= FilePath.IndexOf("f");
            Console.WriteLine(a);

            int b = FilePath.IndexOf("s",3);
            Console.WriteLine(b);

            int c = FilePath.LastIndexOf("x");
            Console.WriteLine(c);

            int d = FilePath.LastIndexOf("s",15);
            Console.WriteLine(d);

            string e = FilePath.Substring(7,2);
            Console.WriteLine(e);

            string f = FilePath.Substring(7);
            Console.WriteLine(f);

            int index = FilePath.LastIndexOf(''\\'');
            Console.WriteLine(index);
            string folder = FilePath.Substring(0, index);
            Console.WriteLine(folder);
            string ShapeName = FilePath.Substring(index + 1);
            Console.WriteLine(ShapeName);

            Console.ReadKey();
        }
    }
}

运行结果:

 

C#中String类的几个方法(IndexOf、LastIndexOf、Substring)

C#中String类的几个方法(IndexOf、LastIndexOf、Substring)

String.IndexOf

String.IndexOf 方法 (Char, Int32, Int32)
报告指定字符在此实例中的第一个匹配项的索引。搜索从指定字符位置开始,并检查指定数量的字符位置。
String.IndexOf(value, startIndex, count)

参数
value:要查找的 Unicode 字符。 
startIndex:搜索起始位置。 
count:要检查的字符位置数。
返回值(Int32):
如果找到该字符,则为 value 的索引位置;否则如果未找到,则为 -1。 


示例:
string str = "深圳市盈基实业有限公司国际通邓事文*深圳市盈基实业有限公司国际通邓事文";
Label1.Text = str.IndexOf("中国").ToString();//返回 -1 
Label1.Text = str.IndexOf("盈基").ToString();//返回 3 
Label1.Text = str.IndexOf("盈基",10).ToString();//返回21 说明:这是从第10个字符开始查起。 
Label1.Text = str.IndexOf("邓",15,10).ToString();//返回 -1
Label1.Text = str.IndexOf("邓",15,20).ToString();//返回 -32 说明:从第15个字符开始查找,要查找的范围是从第15个字符开始后20个字符,即从第15-35个字符中查找。

String.LastIndexOf

String.LastIndexOf 方法
报告指定的 Unicode 字符或 String 在此实例中的最后一个匹配项的索引位置。

名称 说明   String.LastIndexOf (Char) 报告指定 Unicode 字符在此实例中的最后一个匹配项的索引位置。 String.LastIndexOf (String) 报告指定的 String 在此实例内的最后一个匹配项的索引位置。 String.LastIndexOf (Char, Int32) 报告指定 Unicode 字符在此实例中的最后一个匹配项的索引位置。该搜索从指定字符位置开始。 String.LastIndexOf (String, Int32) 报告指定的 String 在此实例内的最后一个匹配项的索引位置。该搜索从指定字符位置开始。 String.LastIndexOf (String, StringComparison) 报告指定字符串在当前 String 对象中最后一个匹配项的索引。一个参数指定要用于指定字符串的搜索类型。 String.LastIndexOf (Char, Int32, Int32) 报告指定的 Unicode 字符在此实例内的子字符串中的最后一个匹配项的索引位置。搜索从指定字符位置开始,并检查指定数量的字符位置。 String.LastIndexOf (String, Int32, Int32) 报告指定的 String 在此实例内的最后一个匹配项的索引位置。搜索从指定字符位置开始,并检查指定数量的字符位置。 String.LastIndexOf (String, Int32, StringComparison) 报告指定字符串在当前 String 对象中最后一个匹配项的索引。参数指定当前字符串中的起始搜索位置,以及要用于指定字符串的搜索类型。 String.LastIndexOf (String, Int32, Int32, StringComparison) 报告指定的 String 对象在此实例内的最后一个匹配项的索引位置。参数指定当前字符串中的起始搜索位置、要搜索的当前字符串中的字符数量,以及要用于指定字符串的搜索类型。



示例:
string str = "深圳市盈基实业有限公司国际通邓事文*深圳市盈基实业有限公司国际通邓事文";
Label1.Text = str.LastIndexOf("邓文").ToString();//返回-1
Label1.Text = str.LastIndexOf("邓").ToString();//返回32

Label1.Text = str.LastIndexOf("邓",8).ToString();//返回-1
Label1.Text = str.LastIndexOf("邓",20).ToString();//返回14
Label1.Text = str.LastIndexOf("邓",33).ToString();//返回32
说明:在指定的范围内查找字符,这个范围是上面的输入的参数,理解为,从索引0开始到指定的数值位置范围内查找最后一个匹配的的字符串的位置。示例中,0-8中没有“邓”字,所以返回-1,0-20范围中,有一个“邓”字在索引14位置上,0-33范围中有两个“邓”字,因为LastIndexOf是返回最后一个匹配项索引位置,所以返32,而不是14。

String.Substring

String.Substring 方法
从此实例检索子字符串。 

名称 说明 String.Substring (Int32) 从此实例检索子字符串。子字符串从指定的字符位置开始。 String.Substring (Int32, Int32) 从此实例检索子字符串。子字符串从指定的字符位置开始且具有指定的长度。



示例:
string str = "深圳市盈基实业有限公司国际通邓事文*深圳市盈基实业有限公司国际通邓事文";
Label1.Text = str.Substring(11);//返回 “国际通邓事文*深圳市盈基实业有限公司国际通邓事文”
Label1.Text = str.Substring(11,7);//返回 “国际通邓事文*”

总结一下:

IndexOf、LastIndexOf都是返回一个位置,是个整数值;找不到都返回-1;
IndexOf是从左向右查,LastIndexOf是从右向左查,不管是IndexOf还是LastIndexOf,索引序列都是从左到右的(起始值是0)
Substring是字符串截取,返回值是一个截取后的字符串。

delphi – TStringList.IndexOf:indexof中的通配符?

delphi – TStringList.IndexOf:indexof中的通配符?

我想在字符串列表中检索linenumber(从文件加载).
Indexof似乎完全匹配.有没有办法检索带有通配符版本的Indexof的行?像SL.Indexof(‘?sometext’)这样的东西?

谢谢!

解决方法

如果你想匹配字符串的某些部分,没有任何花哨的通配符,正如你在另一个答案的注释中指出的那样,那么你可以使用这样一个简单的函数:
function FindMatchStr(Strings: TStrings; const SubStr: string): Integer;
begin    
  for Result := 0 to Strings.Count-1 do
    if Containsstr(Strings[Result],SubStr) then
      exit;
  Result := -1;
end;

如果你想要一个不区分大小写的匹配,那么你可以使用这个:

function FindMatchText(Strings: TStrings; const SubStr: string): Integer;
begin    
  for Result := 0 to Strings.Count-1 do
    if ContainsText(Strings[Result],SubStr) then
      exit;
  Result := -1;
end;

Containsstr和ContainsText在StrUtils RTL单元中定义,并遵循Str的标准约定来表示区分大小写的比较,而Text则表示不区分大小写.

IndexOf、LastIndexOf、Substring的用法

IndexOf、LastIndexOf、Substring的用法

 

 

  String.IndexOf

  String.IndexOf 方法 (Char, Int32, Int32)
报告指定字符在此实例中的第一个匹配项的索引。搜索从指定字符位置开始,并检查指定数量的字符位置。
String.IndexOf(value, startIndex, count)

参数
value:要查找的 Unicode 字符。 
startIndex:搜索起始位置。 
count:要检查的字符位置数。
返回值(Int32):
如果找到该字符,则为 value 的索引位置;否则如果未找到,则为 -1。

 

 

String.LastIndexOf

String.LastIndexOf 方法
报告指定的 Unicode 字符或 String 在此实例中的最后一个匹配项的索引位置。

名称 说明  
String.LastIndexOf (Char) 报告指定 Unicode 字符在此实例中的最后一个匹配项的索引位置。
String.LastIndexOf (String) 报告指定的 String 在此实例内的最后一个匹配项的索引位置。
String.LastIndexOf (Char, Int32) 报告指定 Unicode 字符在此实例中的最后一个匹配项的索引位置。该搜索从指定字符位置开始。
String.LastIndexOf (String, Int32) 报告指定的 String 在此实例内的最后一个匹配项的索引位置。该搜索从指定字符位置开始。
String.LastIndexOf (String, StringComparison) 报告指定字符串在当前 String 对象中最后一个匹配项的索引。一个参数指定要用于指定字符串的搜索类型。
String.LastIndexOf (Char, Int32, Int32) 报告指定的 Unicode 字符在此实例内的子字符串中的最后一个匹配项的索引位置。搜索从指定字符位置开始,并检查指定数量的字符位置。
String.LastIndexOf (String, Int32, Int32) 报告指定的 String 在此实例内的最后一个匹配项的索引位置。搜索从指定字符位置开始,并检查指定数量的字符位置。
String.LastIndexOf (String, Int32, StringComparison) 报告指定字符串在当前 String 对象中最后一个匹配项的索引。参数指定当前字符串中的起始搜索位置,以及要用于指定字符串的搜索类型。
String.LastIndexOf (String, Int32, Int32, StringComparison) 报告指定的 String 对象在此实例内的最后一个匹配项的索引位置。参数指定当前字符串中的起始搜索位置、要搜索的当前字符串中的字符数量,以及要用于指定字符串的搜索类型。



示例:
string str = "深圳市盈基实业有限公司国际通邓事文*深圳市盈基实业有限公司国际通邓事文";
Label1.Text = str.LastIndexOf("邓文").ToString();//返回-1
Label1.Text = str.LastIndexOf("邓").ToString();//返回32

Label1.Text = str.LastIndexOf("邓",8).ToString();//返回-1
Label1.Text = str.LastIndexOf("邓",20).ToString();//返回14
Label1.Text = str.LastIndexOf("邓",33).ToString();//返回32
说明:在指定的范围内查找字符,这个范围是上面的输入的参数,理解为,从索引0开始到指定的数值位置范围内查找最后一个匹配的的字符串的位置。示例中,0-8中没有“邓”字,所以返回-1,0-20范围中,有一个“邓”字在索引14位置上,0-33范围中有两个“邓”字,因为LastIndexOf是返回最后一个匹配项索引位置,所以返32,而不是14。

 

String.Substring

String.Substring 方法
从此实例检索子字符串。 

 

名称 说明
String.Substring (Int32) 从此实例检索子字符串。子字符串从指定的字符位置开始。
String.Substring (Int32, Int32) 从此实例检索子字符串。子字符串从指定的字符位置开始且具有指定的长度。

 



示例:
string str = "深圳市盈基实业有限公司国际通邓事文*深圳市盈基实业有限公司国际通邓事文";
Label1.Text = str.Substring(11);//返回 “国际通邓事文*深圳市盈基实业有限公司国际通邓事文”
Label1.Text = str.Substring(11,7);//返回 “国际通邓事文*”

Label1.Text = str.Substring(str.Length-3,3); // 返回邓事文,即截倒数3位字符

总结:

IndexOf、LastIndexOf都是返回一个位置,是个整数值;找不到都返回-1;
IndexOf是从左向右查,LastIndexOf是从右向左查,不管是IndexOf还是LastIndexOf,索引序列都是从左到右的(起始值是0)
Substring是字符串截取,返回值是一个截取后的字符串。

 

 

转自:https://www.cnblogs.com/dujinyang/p/4788028.html

关于为什么String.indexOf不使用KMP?的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于C# 中indexOf、lastIndexOf、subString方法的理解、C#中String类的几个方法(IndexOf、LastIndexOf、Substring)、delphi – TStringList.IndexOf:indexof中的通配符?、IndexOf、LastIndexOf、Substring的用法等相关内容,可以在本站寻找。

本文标签: