在本文中,我们将为您详细介绍为什么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)
- C# 中indexOf、lastIndexOf、subString方法的理解
- C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
- delphi – TStringList.IndexOf:indexof中的通配符?
- IndexOf、LastIndexOf、Substring的用法
为什么String.indexOf()不使用KMP?(为什么string不用new)
我阅读的源代码,java.lang.String
很惊讶地发现它String.indexof()
不使用Knuth–Morris–Pratt算法?众所周知,KMP更有效。那么为什么不使用它String.indexOf()
呢?
我周围的人告诉我,对于短字符串KMP来说已经足够了,但是如果您需要性能并且打算与大字符串一起使用,则不是一个好选择。但是他没有告诉我细节。
所以,这是我的问题:
- 为什么我们不使用KMP
String.indexOf()
? - 为什么KMP对于大字符串不是一个好选择?
答案1
小编典典KMP在最坏情况下具有更好的性能,但实际上需要进行一些前期计算(以生成偏移表)。这 还 需要一个初始的内存分配,这也可能会影响性能。
对于(大概)在较短字符串中进行搜索的常见用例,这实际上可能比原始实现要慢。
这与以下事实捆绑在一起:对于非常庞大的数据集,您可能将使用更专业的数据结构,而不是简单的String
方法,这意味着增加的实现(可能还有运行时)成本不值得投资。
请注意,由于未指定实际算法,因此在将来的Java版本中这 可能会 更改。
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)
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 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 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中的通配符?
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的用法
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的用法等相关内容,可以在本站寻找。
本文标签: