查找一个字符串中相同字符串或字符的个数
有四种思路,消耗内存和时间递增:
1.遍历(弃用,使用 substring ,每次截取当前字符串的后面字符串,然后使用 Contains 查看后面字符串还有没有匹配项,如果还有,那么截取后面的字符串),这一步很花时间,因为每次都要截取字符串,等于需要遍历,如果数量 >10W 的时候,毋庸置疑会比较卡顿,但是处理小文件也可以,只是大文件十分不推荐。
2. IndexOf(),如果 整个字符串.IndexOf (String value , int startIndex)!= -1,那么有匹配项,再次startIndex+1后再次查找即可。这一步省去了每一次都要截取一定长度的字符串的时间。
3. Count(),但是要注意Count()方法需要的是 IEnumerable< char > 类型的参数,可以使用 lambda表达式,但是这个方法有局限性,只能查找单个字符,如果你想查找的是一个字符串,这个方法不管用。
4.将当前需要查找的这个字符串在整个字符串中全部替换成空字符,然后用删除之前的字符串的长度减去现在剩余字符串的长度,差额 / 单位长度,用到的函数是Replace(),消耗内存量和时间都最短,字符串和字符都能够通用。
在此只例举后面三种方法,遍历方法弃用
1. IndexOf()
//相同字符串的个数
int countNum;
//相同字符串的位置List
List<int> breakIndex;
private void CalculateNum(string father, string son)
{
countNum = 0;
breakIndex = new List<string>();
int index = father.IndexOf(son);
while(index!=-1)
{
countNum++;
breakIndex.Add(index);
//这里 Index+1 是为了检索下一个的时候,位置需要向后挪1个字符,而不是挪 son.length 长度
index += index;
index = father.IndexOf(son,index);
}
}
//打印个数
Console.WriteLine(countNum);
2. Count()--------- 查找单个字符
//整个字符串
string father;
//需要查找的字符串
string son;
private void CountNum()
{
//这里查找的单个字符是换行符,Count 方法中用 lambda 表达式
int number = father.Count(i => i == '\n');
//打印个数
Console.WriteLine(number);
}
3. 通用最高效方法
//整个字符串
string father;
//需要查找的字符串
string son;
private int CountNumber()
{
//判断是否有相同字符串
if (father.Contains(son))
{
//用一个字符串储存被替换后的整个字符串
string strReplaced = father.Replace(son, "");
//两个字符串的长度差值 / 被替换掉的字符串单位长度
return (father.Length - strReplaced.Length) / son.Length;
}
//没有返回0个
return 0;
}
void Main()
{
//存储相同的个数
int countNum = CountNumber();
//打印个数
Console.WriteLine(countNum);
}