[100分] 求教一個簡單的字符串替換處理的快速算法.
題目:
程序中預先定義了一些變量存儲在一個 NameValueCollection 裏面, 例如:
NameValueCollection vars = new NameValueCollection();
vars["name"] = "Bush"; // 定義 name 參量為 Bush
vars["object"] = "Monkey"; // 定義 object 參量為 Monkey
然後根據這套預定義參量, 我輸入一個字符串如: "%name% is %object%", 求一個快速的處理函數 string ProcessString(string input, NameValueCollection vars), 能夠把上述字符串中的變量名替換為預定義變量中的值. (即輸出為 "Bush is Monkey")
ps: 本人原先用 Regex 處理, 但是速度達不到要求, 後來改成了逐 char 分析字符串手工處理, 但感覺寫出來的代碼有點長可讀性不佳, 故在此求一個比較好的算法. thx.
问题点数:100、回复次数:10Top
1 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-05-01 17:58:40 得分 0
尝试StringBuilder的Replace方法,尽管Regex效率很高,但是没有编译的动态生成的Regex和以及多次体会会让它效率下降不少的……。
如果还觉得满,就只好祭出unsafe和C++ Native的大旗了。Top
2 楼IkusaHime(一品茉莉)回复于 2006-05-01 18:05:29 得分 0
我的原始代碼如下, 感覺很蹩腳 ... 求改進算法.
public static string ParseString(string input, NameValueCollection vars) {
if (string.IsNullOrEmpty(input)) { return ""; }
StringBuilder var = new StringBuilder(16);
StringBuilder result = new StringBuilder(input.Length);
int flag = 0;
for (int i = 0; i < input.Length; i++) {
char c = input[i];
if (flag < 1) {
if (c != '%') {
result.Append(c);
} else {
flag = 1;
continue;
}
} else {
if (c != '%') {
var.Append(c);
} else {
string search = var.ToString();
string replace = vars[search];
result.Append(replace);
var.Length = 0;
flag = 0;
continue;
}
}
}
return result.ToString();
}Top
3 楼insiderc()回复于 2006-05-01 18:31:01 得分 0
把% 换成<>好处理,如"<Name> is <Object>"
1步:来获取"<Name>",余下" is <Object>"
处理"<Name>"为"Name"
retStr=vars["Name"]
2 步:从余下" is <Object>"中截取"<Object>"
retStr=" is "
处理"<Object>"为"Object"
retStr=vars["Object"]
3 步:返回retStrTop
4 楼IkusaHime(一品茉莉)回复于 2006-05-01 18:37:53 得分 0
樓上的兄弟你的意思我還不太明白, 爲什麽 < 比 % 要好處理 ?Top
5 楼IkusaHime(一品茉莉)回复于 2006-05-01 22:57:40 得分 0
顶一下 ....Top
6 楼EmotionalIntelligenc(听海(廷海))回复于 2006-05-01 23:10:49 得分 0
其实正则表达式就可以了啊 要是自己想写的话就用kmp算法或者起改进的算法就可以了啊Top
7 楼Knight94(愚翁)回复于 2006-05-02 09:06:36 得分 0
Have a try!
const string STRING_FORMAT = "{0} is {1}";
private string FormatString( object[] data )
{
return string.Format( STRING_FORMAT, data );
}Top
8 楼insiderc()回复于 2006-05-02 23:34:54 得分 0
愚翁的是作为定式用,不能动态咧,不过这种定式倒是简洁,值得学习Top
9 楼webwait(webwei)回复于 2006-05-03 00:35:27 得分 0
markTop
10 楼IkusaHime(一品茉莉)回复于 2006-05-06 15:26:24 得分 0
string.Format 中的变量好像要按照顺序填入才有效, 对本问不合. 另外 string.Format 效率也不高, 处理的时候考虑了很多东西如 cultureinfo, formatprovider 之类的, 根本用不上.
自己想到了一个算法, 把输入字符串用 Split 按照 % 切成小段数组, 双数索引的值不变, 单数索引的值就是变量. 本方法平均效率比我 3 楼的逐字符扫描高一点点, 特殊情况下(例如字符串很长, 当中变量很少)可以快 50% 以上.
Top




