首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求一字符串处理方法,要最有效率的 [已结贴,结贴人:wangfuchong]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 17:25:27 楼主
    两个字符串,每个字符串都是由“名称字符串=值字符串”形式组成,中间间隔为一个分号加空格

    字符串a:
    名称1=任意字符串1; 名称2=任意字符串2; ...; 名称n=任意字符串n
    字符串b:
    名称5=任意字符串5; 名称1=任意字符串6;...; 名称m=任意字符串m

    现在要处理字符串a,使之变成:
    名称1=任意字符串6; 名称2=任意字符串2; 名称n=任意字符串n; 名称5=任意字符串5; 名称m=任意字符串m

    也就是如果字符串a中的一个名称在字符串b中也有,则其值由字符串b中名称对应的值取代。如果字符串b中的名称在a中不存在,则在a中添加名称及值。当然也要用分号加一个空格间格。

    例如
    string a="wang=asdf; li=yuio; zhao=qwewteqyrqyreqq; qian=dsahjdglsdagdjsalg";
    string b="zhou=dsagdsagsdahag; wang=xxxxxxxxxxyyyyyyyyyyzzzzzzzzzz; qian=ghjk; wu=saghdsaklg";
    则经过处理应该a="wang=xxxxxxxxxxyyyyyyyyyyzzzzzzzzzz; li=yuio; zhao=qwewteqyrqyreqq; qian=ghjk; zhou=dsagdsagsdahag; wu=saghdsaklg"

    求一个讲究效率的转换方法
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 17:35:221楼 得分:1
    常规的思路就是分割成字符串数组比较吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 17:53:572楼 得分:2
    先拆分到数组中.然后再去比对.效率暂时没去研究...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 18:09:303楼 得分:2
    分割似乎不够快吧?
    看起来可以用indexOf查找分号附近的id,用dictionary来比对
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 18:16:354楼 得分:1
    采用hashtable
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 18:30:135楼 得分:0
    100分等
    最好具体的程序
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 20:00:056楼 得分:2
                //用这个方法把字符串拆解开 
                string str = "a;b;c";
                string []stra;           
                stra = str.Split(";".ToCharArray());
                //然后将拆开的字符串进行比较(=号前的部分),也就是2个字符串数组进行比较
                  //比较后用StringBuilder在添加成一个新的字符串
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 20:45:097楼 得分:2
    两个Dictionary <string,string> ListA=new Dictionary <string,string>();
    Dictionary <string,string> ListB=new Dictionary <string,string>();
    然后Split("="); =号前面是key后面是value
    然后比较key吧...一样就替换啊

    代码还是自己写,这样更能理解。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 22:51:028楼 得分:0
    C# code
    using System.Collections.Specialized; //StringDictionary -> 键值集合, Key 不区分大小写.. string[] temp; string a = "wang=asdf; li=yuio; zhao=qwewteqyrqyreqq; qian=dsahjdglsdagdjsalg"; string b = "zhou=dsagdsagsdahag; wang=xxxxxxxxxxyyyyyyyyyyzzzzzzzzzz; qian=ghjk; wu=saghdsaklg"; StringDictionary bs = new StringDictionary(); foreach (string var in b.Split(';')) { temp = var.Split('='); temp[0] = temp[0].Trim(); bs.Add(temp[0], temp[1]); } StringDictionary as = new StringDictionary(); foreach (string var in a.Split(';')) { temp = var.Split('='); temp[0] = temp[0].Trim(); if (bs.Contains(temp[0])) //bs.ContainsKey(temp[0]) { as.Add(temp[0], bs[temp[0]]); } else { as.Add(temp[0], temp[1]); } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 23:03:259楼 得分:0
    稍作改进:

    C# code
    string result = ""; foreach (string var in a.Split(';')) { temp = var.Split('='); if (bs.Contains(temp[0].Trim())) //bs.ContainsKey(temp[0].Trim()) { result += temp[0] + "=" + bs[temp[0].Trim()]; } else { result += temp[0] + "=" + temp[1]; } result += ";"; } Console.WriteLine(result);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 23:05:4410楼 得分:0
    根据情况, 再作优化..
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-29 10:10:0411楼 得分:0
    谢谢楼上

    本人不是程序员的料,不敢确定怎样效率高
    有了现成的代码,省得动我自己也不知道能否写出较为简捷有效的代码的脑筋了。


    不过上面代码好像还有点瑕疵
    最后可能多一个";"
    b中有而a中没有的有可能会不被添加到a中


    再次谢谢
    如看不到更完整有效的就准备结贴了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • boblaw
    • 等级:
    发表于:2008-03-29 10:37:4312楼 得分:0
    C# code
    string a = "wang=asdf; li=yuio; zhao=qwewteqyrqyreqq; qian=dsahjdglsdagdjsalg"; string b = "zhou=dsagdsagsdahag; wang=xxxxxxxxxxyyyyyyyyyyzzzzzzzzzz; qian=ghjk; wu=saghdsaklg"; string[] aArray = a.Split(new char[] { '=', ';' }, StringSplitOptions.None); string[] bArray = b.Split(new char[] { '=', ';' }, StringSplitOptions.None); StringDictionary dic = new StringDictionary(); for (int i = 0; i < aArray.Length-1; i+=2) { dic[aArray[i]] = aArray[i + 1]; } for (int i = 0; i < bArray.Length - 1; i += 2) { dic[bArray[i]] = bArray[i + 1]; } StringBuilder sb = new StringBuilder(); foreach (string key in dic.Keys) { sb.Append(key +"=" +dic[key] +";"); } Console.WriteLine(sb.ToString());
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-29 11:18:1413楼 得分:50
    C# code
    Console.WriteLine(result.Substring(0, result.Length - 1)); //这样就可去除最后的";"
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-29 11:20:4314楼 得分:10
    试试正则
    C# code
    string a = "wang=asdf; li=yuio; zhao=qwewteqyrqyreqq; qian=dsahjdglsdagdjsalg"; string b = "zhou=dsagdsagsdahag; wang=xxxxxxxxxxyyyyyyyyyyzzzzzzzzzz; qian=ghjk; wu=saghdsaklg"; StringBuilder sb = new StringBuilder(); Regex reg = new Regex(@"([^=]+?=)([^;]*?);\s*"); foreach(Match m in reg.Matches(a + ";" + b + ";")) { Regex regM = new Regex(m.Groups[1].Value + @"([^;]*?);\s*"); if (regM.IsMatch(sb.ToString())) { sb.Replace(m.Groups[1].Value + regM.Match(sb.ToString()).Groups[1].Value ,m.Groups[1].Value + m.Groups[2].Value); } else sb.Append("; " + m.Groups[1].Value + m.Groups[2].Value); } sb.Remove(0, 2); System.Diagnostics.Debug.WriteLine(sb.ToString());
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • boblaw
    • 等级:
    发表于:2008-03-29 11:39:0715楼 得分:30
    简单的处理,建议不要使用正则表达式,与String类的方法相比,正则表达式的性能会差几十倍.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-29 18:01:2216楼 得分:0
    boblaw的代码也有一点小问题,当然是也小问题啦
    dic[aArray[i]].trim()就好了
    也同样末尾存在多余的东西
    次序发生变化,但是对于我的使用无妨

    正则方法准确无误

    我的破笔记本配置太低01年买的了,也不知道能不能测试,分不出,正则好像确实慢

    感谢回帖,真不知道该怎么分分,尽管也许不在乎
    先来者优先吆
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-29 18:14:3817楼 得分:0
    正则显然存在速度问题;
    分组只能好一点,精确是可以掌握的;
    我建议
    1.建立一个索引ai(名称字串,位置,长度),bi(名称字串,位置,长度)
    2.分别对ai和bi排序,
    3.删除存在于bi中的ai名称字串,
    4.对照ai和bi重新建立新字串c
    这样对字符串的操作要少得多.


    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved