老师你留下了关于自定义一个Replace方法的一个坑,我可能有点强迫症,不填完这个坑就看不下去了,但是我自己能力有限,感觉把自己赶死胡同里了
问题是这里的问题:
我的代码:
public StringDS Replace(StringDS str, String Restr)
{
bool isEnd = true;
string olddata=new string(this.data);
string newdata = "";
int len = Restr.Length;
while (isEnd)
{
int index = olddata.IndexOf(new string(str));
if (index != -1)
{
Console.WriteLine(index + str.GetLength());
for (int i = 0; i < index; i++)
{
newdata += olddata[i];
}
newdata += Restr;
for (int i = olddata.Length; i >= index + str.GetLength()-1; i--)
{
olddata[i] = olddata[i - (index + str.GetLength())]; //这一行报错了,olddata下标越界
}
}
else
{
isEnd = false;
}
}
return new StringDS(newdata);
}
这段代码的思路是这样的,我把olddata(即被替代的字符串)的前半段(即被替换的字符串的前面)放到一个新的字符串newdata里,然后把被替换的字符串也加到新的字符串里。然后olddata就把被替换掉的前面部分去掉,只留下未被替换的部分,如此循环,直到找不到需要被替换的字符串为止。思路是这样,但是操作起来,就很容易olddata数组下标越界,因为元素不固定,所以我就迷茫了……
PS:希望可以给提问区加一个搜索功能,便于查找以前同类的问题
for (int i = olddata.Length; i >= index + str.GetLength()-1; i--)
{
olddata[i] = olddata[i - (index + str.GetLength())]; //这一行报错了,olddata下标越界
}
修改为
string temp ="";
for (int i = index+str.GetLength();i<olddata.length ; i++)
{
temp += olddata[i];
}
olddata=temp
注意olddata是string不能修改单个字符的
public StringDS Replace(StringDS str, String Restr)
{
bool isEnd = true;
string olddata = new string(this.data);
string newdata = "";
int len = Restr.Length;
while (isEnd)
{
int index = olddata.IndexOf(str.ToString());
if (index != -1)
{
for (int i = 0; i < index; i++)
{
newdata += olddata[i];
}
newdata += Restr;
string temp = "";//装载新字符串的临时变量(olddata是引用类型,不可修改)
for (int i = index+str.GetLength(); i < olddata.Length; i++)
{
temp += olddata[i];
}
olddata = temp;
}
else
{
newdata += olddata;
isEnd = false;
}
}
return new StringDS(newdata);
}
不过还有点bug,替换之后没加上剩下的字符串,所以需要在最后的时候加上
测试结果:
StringDS s = new StringDS("I am a teacher,teacher");
Console.WriteLine(s.Replace(new StringDS("tea"), "cell").ToString());
我还是没有忍住,吐槽一下哈。siki老师不要批评我。
其实,楼主应该去研究研究字符串匹配算法,当然,这些算法大都是C++描述的,但着不影响理解算法本身的意义,语言只是工具而已。
经典的字符串匹配算法有:朴素的遍历算法(你这个就是);Rabin-Karp算法(改进的朴素算法);有穷自动机算法(很容易构建词法分析器);Kmp算法(效率最高的算法,没有之一,当然理解起来最费劲。有很多针对KMP基本思路的改进)
另外再说一点,这些算法,都是有底层API的,你直接调用就行了。你自己写的方法,可能会有效率问题、安全问题、小BUG等等。。。何必要再造轮子呢??用系统大神造好的不锈钢轮子,不比用你自己造的木头轮子好么。