【如何最高效的排除字符串中重复值】

nchen123 2004-09-08 05:19:05
字符串为:

皮疹,晕厥,皮疹,肤泻,皮疹,恶心,呕吐,心悸,喉水肿,心悸,皮疹,皮疹,过敏性休克,过敏性休克,寒战,*胸闷,*气急,呕吐,变态反应,寒战,腹痛,皮疹,恶心,呕吐,荨麻疹,过敏样反应,心悸,多汗,过敏性休克,头晕,舌麻痹,皮疹,恶心,呕吐,过敏样反应,瘙痒,*胸闷,心悸,皮疹,瘙痒,皮疹,皮疹,皮疹,瘙痒,震颤,过敏样反应,皮疹,过敏样反应,荨麻疹,过敏样反应,红斑疹

现在要得到排除了其中的重复值之后的新字符串, 有很多方法可以做到这一点, 比如从第一位开始分析字符串, 或者使用 Scripting.Dictionary 对象逐个添加进去再判断排除, 或者使用数组, 或者...

因为这样的字符串非常多, 有几千条。如果使用复杂的对象比如 Scripting.Dictionary, 可以想象,速度一定像蜗牛一样。 我的想法是使用正则表达式来解决这个问题, 可是如何解决还没有想好。
大家帮忙想想,有什么好的办法都可以写出来, 最后按照最接近完美答案的程度来给分。

假设, 字符串中的分隔符是统一的, 比如都是逗号。
...全文
832 129 打赏 收藏 转发到动态 举报
写回复
用AI写文章
129 条回复
切换为时间正序
请发表友善的回复…
发表回复
nchen123 2005-03-30
  • 打赏
  • 举报
回复
想不到现在还有人关注这老贴阿!

sorry for the inconveniance,

技术贴讨论到最后回复太多都像水贴了。。。
fzxml 2005-03-30
  • 打赏
  • 举报
回复
这种帖子最后应该总结一下,那种方法最好,并写在后面呀,要不然太长了,看起来也够累的
fzxml 2005-03-30
  • 打赏
  • 举报
回复
mark
delong8307 2004-09-09
  • 打赏
  • 举报
回复
这些算法都不错
保存
nchen123 2004-09-09
  • 打赏
  • 举报
回复
嗯,这样改过后在我的机器上运行时间为 4640.625, 好多了,不过还不是好的办法,因为循环就多了一层,可以想象算法的复杂度增加了。

=========================
【木野狐】
sinusoid 2004-09-09
  • 打赏
  • 举报
回复
<script language=vbscript>


function test(str)
arr=split(str,",")
l=lbound(arr)
u=ubound(arr)
for i=l to u
flag=0
for j=l to i-1
if arr(i)=arr(j) then
flag=1 '重复
exit for
end if
next
if flag=0 then test = test & "," & arr(i)
next
test =mid(test,2)
end function

'以下是测试部分
dim vbsBegin : vbsBegin = Timer()
dim a
a="皮疹,晕厥,皮疹,肤泻,皮疹,恶心,呕吐,心悸,喉水肿,心悸,皮疹,皮疹,过敏性休克,过敏性休克,寒战,*胸闷,*气急,呕吐,变态反应,寒战,腹痛,皮疹,恶心,呕吐,荨麻疹,过敏样反应,心悸,多汗,过敏性休克,头晕,舌麻痹,皮疹,恶心,呕吐,过敏样反应,瘙痒,*胸闷,心悸,皮疹,瘙痒,皮疹,皮疹,皮疹,瘙痒,震颤,过敏样反应,皮疹,过敏样反应,荨麻疹,过敏样反应,红斑疹"

dim vbstest : vbstest = 3000
dim result : result = ""
for k =0 to vbstest
result = test(a)
next
dim vbsEnd : vbsEnd = Timer()
document.write "做完这件事需要" & (vbsEnd - vbsBegin) * 1000 & "豪秒<br/>"
</script>

运行 3000 次调用需要花费的时间(ms)

做完这件事需要4125豪秒

放心,不会很慢啊
nchen123 2004-09-09
  • 打赏
  • 举报
回复
对于数组,还是用索引来遍历效率高一些,这个是肯定的。尽量不要使用 for each, for in 之类的语法。 C# 中也是这样。

for each 这种语法的长处在于遍历集合对象,而不是数组。

=========================
【木野狐】
潜水的鱼 2004-09-09
  • 打赏
  • 举报
回复
测试疏乎,


两种循环速度一样,
themedy 2004-09-09
  • 打赏
  • 举报
回复
学习一下先。。。
OnlyVB 2004-09-09
  • 打赏
  • 举报
回复
to qiozi(穷.神啊,再给我一百年吧~)
在我机子上for i = 0 to ubound(b)和for each aaa in a 一样,所以我尽量不改动大笨狼的代码。
实际不需要s变量的,直接写成f就行。
dayanmao 2004-09-09
  • 打赏
  • 举报
回复
我目前只会用数组解决,学习ing...
OnlyVB 2004-09-09
  • 打赏
  • 举报
回复
to ren791123(ren)
你的代码是错误的!
if instr(d,b(i))=0 then有问题,看看楼上各位怎么写的!!
要不,你测试一下!
a="皮疹,晕厥,皮疹,肤泻,皮,泻"
潜水的鱼 2004-09-09
  • 打赏
  • 举报
回复
我说的楼上,

指:ren791123(ren)
潜水的鱼 2004-09-09
  • 打赏
  • 举报
回复
经测试

for i = 0 to ubound(b)



for each aaa in a

快一些

不过楼上的,你要改改判断,
nchen123 2004-09-09
  • 打赏
  • 举报
回复
测试报告:

为了统一比较,下列代码全部改为在服务器端测试。 按照我本机的配置情况(c1.7G, 256M)统一比较。
稍后揭帖给分, 基本上和我预想的结果出入不大。

代码编写者 运行 3000 次调用需要花费的时间(ms)
----------------------------------------------------------------------------------------
itakeblue(牛奶2能量) 671.875
fason 1531
fason2 80766
fason2, 把正则表达式的赋值语句放到函数外 75890
fason3 (第29楼) 1390
wolf, 字典 2187.5
wolf2, 字符串,数组 765.625
ren791123(ren) 和 wolf2 一样的,不再测
sinusoid(黑眼圈) 看着代码就比较慢,怕死机没敢测
OnlyVB(边城浪子) 我测试的时候已经这么顺手改过了


结论:一次分割到数组后循环判断连接到字符串的办法最快。

=========================
【木野狐】
ren791123 2004-09-09
  • 打赏
  • 举报
回复
<%

a="皮疹,晕厥,皮疹,肤泻,皮疹,恶心,呕吐,心悸,喉水肿,心悸,皮疹,皮疹,过敏性休克,过敏性休克,寒战,*胸闷,*气急,呕吐,变态反应,寒战,腹痛,皮疹,恶心,呕吐,荨麻疹,过敏样反应,心悸,多汗,过敏性休克,头晕,舌麻痹,皮疹,恶心,呕吐,过敏样反应,瘙痒,*胸闷,心悸,皮疹,瘙痒,皮疹,皮疹,皮疹,瘙痒,震颤,过敏样反应,皮疹,过敏样反应,荨麻疹,过敏样反应,红斑疹"
b=split(a,",")
DIM d
d=""
for i=0 to ubound(b)
if instr(d,b(i))=0 then
d=d & "," & b(i)
end if
next
d=right(d,len(d)-1)
RESPONSE.WRITE D
%>
皮疹,晕厥,肤泻,恶心,呕吐,心悸,喉水肿,过敏性休克,寒战,*胸闷,*气急,变态反应,腹痛,荨麻疹,过敏样反应,多汗,头晕,舌麻痹,瘙痒,震颤,红斑疹

快快快快快快快快快快快快快快。。。。。。。。。
超级大笨狼 2004-09-09
  • 打赏
  • 举报
回复
哈哈!!
p4 3.2G windows2003 1024M

机器果然newB!!

我的烂机器连网打帝国都不如网吧机器。
超级大笨狼 2004-09-09
  • 打赏
  • 举报
回复
onlyvb优化得好!
nchen123 2004-09-09
  • 打赏
  • 举报
回复
黑眼圈,当然会死机。

因为你函数外面里面用到的变量 i 都没有定义, 被视为一个了, 循环产生了不可预测的结果。

还是养成变量都定义的好习惯吧~~

=========================
【木野狐】
nchen123 2004-09-09
  • 打赏
  • 举报
回复
以后少发技术铁! 揭帖好累!
加载更多回复(109)

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧