◆数组排序
现在一个数组有以下数据:
001;002;aaa;bbb;001;.....
现在需要把它变为(即去掉重反复的并按顺序排列出来)
001;002;aaa;bbb;...
请问在ASP下程序如何写?
谢谢,在线等待。。
问题点数:30、回复次数:9Top
1 楼pli0825(念叨念叨,我念叨死你!)回复于 2006-03-18 13:46:38 得分 4
意思没表达清楚,给的例子也没看明白。
楼主再说清楚点。
这其实也就是个算法的问题Top
2 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-18 13:49:11 得分 20
【如何最高效的排除字符串中重复值】
A :
字符串为:
皮疹,晕厥,皮疹,肤泻,皮疹,恶心,呕吐,心悸,喉水肿,心悸,皮疹,皮疹,过敏性休克,过敏性休克,寒战,*胸闷,*气急,呕吐,变态反应,寒战,腹痛,皮疹,恶心,呕吐,荨麻疹,过敏样反应,心悸,多汗,过敏性休克,头晕,舌麻痹,皮疹,恶心,呕吐,过敏样反应,瘙痒,*胸闷,心悸,皮疹,瘙痒,皮疹,皮疹,皮疹,瘙痒,震颤,过敏样反应,皮疹,过敏样反应,荨麻疹,过敏样反应,红斑疹
现在要得到排除了其中的重复值之后的新字符串, 有很多方法可以做到这一点, 比如从第一位开始分析字符串, 或者使用 Scripting.Dictionary 对象逐个添加进去再判断排除, 或者使用数组, 或者...
因为这样的字符串非常多, 有几千条。如果使用复杂的对象比如 Scripting.Dictionary, 可以想象,速度一定像蜗牛一样。 我的想法是使用正则表达式来解决这个问题, 可是如何解决还没有想好。
大家帮忙想想,有什么好的办法都可以写出来, 最后按照最接近完美答案的程度来给分。
假设, 字符串中的分隔符是统一的, 比如都是逗号。
---------------------------------------------------------------
靠 ,居然不理我
---------------------------------------------------------------
关注一下!
---------------------------------------------------------------
关注一下!
关注一下!
跟了
---------------------------------------------------------------
我只会用数组,哈,写出来只是好玩哦
dim txt,txt_s,txt_ok
txt = "皮疹,晕厥,皮疹,肤泻,皮疹"
txt_s = split(txt,",")
for i = 0 to ubound(txt_s)
if instr(txt_ok,(txt_s(i) & ","))=0 then
txt_ok = txt_ok & txt_s(i) & ","
end if
next
txt_ok = left(txt_ok,(len(txt_ok)-1))
---------------------------------------------------------------
Top
3 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-18 13:50:13 得分 0
呵呵,
问一下:我不是很清楚,测试的时候不能通过。
正则对中文有效么???
---------------------------------------------------------------
这是个算法问题……串的匹配算法,KMP??
---------------------------------------------------------------
<script>
function s1(a,b){return a-b}
var str = "1,2,3,2,6,5,4,7,2";
str = (","+ str).replace(/(.\d+)(.*)(\1)/g, "$2");
str = str.substr(1).split(",").sort(s1).join(",");
alert(str);
</script>
试着改改吧。
---------------------------------------------------------------
'凑个热闹
<%
str="皮疹,晕厥,皮疹,肤泻,皮疹,恶心,呕吐,心悸,喉水肿,心悸,皮疹,皮疹,过敏性休克,过敏性休克,寒战,*胸闷,*气急,呕吐,变态反应,寒战,腹痛,皮疹,恶心,呕吐,荨麻疹,过敏样反应,心悸,多汗,过敏性休克,头晕,舌麻痹,皮疹,恶心,呕吐,过敏样反应,瘙痒,*胸闷,心悸,皮疹,瘙痒,皮疹,皮疹,皮疹,瘙痒,震颤,过敏样反应,皮疹,过敏样反应,荨麻疹,过敏样反应,红斑疹"
call test(str)
%>
<%
sub test(str)
arr=split(str,",")
l=lbound(split(str,","))
u=ubound(split(str,","))
for i=l to u
flag=0
for j=l to i-1
if arr(i)=arr(j) then flag=1 '重复
next
if flag=0 then
response.Write arr(i) &","
end if
next
end sub
%>
---------------------------------------------------------------
用instr最快
a="皮疹,晕厥,皮疹,肤泻,皮疹,恶心,呕吐,心悸,喉水肿,心悸,皮疹,皮疹,过敏性休克,过敏性休克,寒战,*胸闷,*气急,呕吐,变态反应,寒战,腹痛,皮疹,恶心,呕吐,荨麻疹,过敏样反应,心悸,多汗,过敏性休克,头晕,舌麻痹,皮疹,恶心,呕吐,过敏样反应,瘙痒,*胸闷,心悸,皮疹,瘙痒,皮疹,皮疹,皮疹,瘙痒,震颤,过敏样反应,皮疹,过敏样反应,荨麻疹,过敏样反应,红斑疹"
b=split(a,",")
d=""
for i=0 to ubound(b)
if instr(d,b(i))=0 then
d=d & "," & d(i)
end if
next
d=right(d,len(d)-1) '去掉","
---------------------------------------------------------------
大笨狼的:
<script language=vbs>
'以下是测试部分
dim vbsBegin : vbsBegin = Timer()
dim a
a="皮疹,晕厥,皮疹,肤泻,皮疹,恶心,呕吐,心悸,喉水肿,心悸,皮疹,皮疹,过敏性休克,过敏性休克,寒战,*胸闷,*气急,呕吐,变态反应,寒战,腹痛,皮疹,恶心,呕吐,荨麻疹,过敏样反应,心悸,多汗,过敏性休克,头晕,舌麻痹,皮疹,恶心,呕吐,过敏样反应,瘙痒,*胸闷,心悸,皮疹,瘙痒,皮疹,皮疹,皮疹,瘙痒,震颤,过敏样反应,皮疹,过敏样反应,荨麻疹,过敏样反应,红斑疹"
'创建对象
dim vbstest : vbstest = 1000
dim result : result = ""
for j =0 to vbstest
result = F(a)
next
dim vbsEnd : vbsEnd = Timer()
document.write "做完这件事需要" & (vbsEnd - vbsBegin) * 1000 & "豪秒<br/>"
document.write result
function F(x)
dim A,S,tag,aaa
S = ""
A = split(x,",")
for each aaa in A
if instr(S," " & aaa & " ")<1 then S= S & " " & aaa & " "
next
F = trim(replace(S," "," "))
F = replace(F," ",",")
end function
</script>
做完这件事需要187.5豪秒
皮疹,晕厥,肤泻,恶心,呕吐,心悸,喉水肿,过敏性休克,寒战,*胸闷,*气急,变态反应,腹痛,荨麻疹,过敏样反应,多汗,头晕,舌麻痹,瘙痒,震颤,红斑疹
------------------------------------
修改后:
<script language=vbs>
'以下是测试部分
dim vbsBegin : vbsBegin = Timer()
dim a
a="皮疹,晕厥,皮疹,肤泻,皮疹,恶心,呕吐,心悸,喉水肿,心悸,皮疹,皮疹,过敏性休克,过敏性休克,寒战,*胸闷,*气急,呕吐,变态反应,寒战,腹痛,皮疹,恶心,呕吐,荨麻疹,过敏样反应,心悸,多汗,过敏性休克,头晕,舌麻痹,皮疹,恶心,呕吐,过敏样反应,瘙痒,*胸闷,心悸,皮疹,瘙痒,皮疹,皮疹,皮疹,瘙痒,震颤,过敏样反应,皮疹,过敏样反应,荨麻疹,过敏样反应,红斑疹"
'创建对象
dim vbstest : vbstest = 1000
dim result : result = ""
for j =0 to vbstest
result = F(a)
next
dim vbsEnd : vbsEnd = Timer()
document.write "做完这件事需要" & (vbsEnd - vbsBegin) * 1000 & "豪秒<br/>"
document.write result
function F(x)
dim A,S,tag,aaa
S = ","
A = split(x,",")
for each aaa in A
if instr(S,"," & aaa & ",")<1 then S= S & aaa & ","
next
F = mid(s,2,len(s)-2)
end function
</script>
做完这件事需要140.625豪秒
皮疹,晕厥,肤泻,恶心,呕吐,心悸,喉水肿,过敏性休克,寒战,*胸闷,*气急,变态反应,腹痛,荨麻疹,过敏样反应,多汗,头晕,舌麻痹,瘙痒,震颤,红斑疹
---------------------------------------------------------------
Top
4 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-18 13:51:39 得分 0
我也来凑一下热闹..执行成功, 可能数据量太小了..显示0.000
<%
Dim strSource, strOK, i, arrStr, startTime
startTime = Timer()
strSource = "皮疹,晕厥,皮疹,肤泻,皮疹,恶心,呕吐,心悸,喉水肿,心悸,皮疹,皮疹,过敏性休克,过敏性休克,寒战,*胸闷,*气急,呕吐,变态反应,寒战,腹痛,皮疹,恶心,呕吐,荨麻疹,过敏样反应,心悸,多汗,过敏性休克,头晕,舌麻痹,皮疹,恶心,呕吐,过敏样反应,瘙痒,*胸闷,心悸,皮疹,瘙痒,皮疹,皮疹,皮疹,瘙痒,震颤,过敏样反应,皮疹,过敏样反应,荨麻疹,过敏样反应,红斑"
arrStr = Split(Replace(strSource, " ", ""), ",")
strOk = ","
For i = 0 to UBound(arrStr)
if Instr(1, strOk, "," & arrStr(i) & ",", 1) = 0 Then
strOk = strOk & arrStr(i) & ","
End If
Next
strOk = Mid(strOk, 2, len(strOk) - 2)
response.Write(strOk)
response.Write("<br>")
response.Write("执行时间: " & FormatNumber((Timer() - startTime) * 1000, 3, true) & " 毫秒")
%>
---------------------------------------------------------------
再优化一下大笨狼的代码如下:
<script language=vbs>
'以下是测试部分
dim vbsBegin,a,j,vbstest,result,vbsEnd
vbsBegin = Timer()
vbstest = 1000
result = ""
a="皮疹,晕厥,皮疹,肤泻,皮疹,恶心,呕吐,心悸,喉水肿,心悸,皮疹,皮疹,过敏性休克,过敏性休克,寒战,*胸闷,*气急,呕吐,变态反应,寒战,腹痛,皮疹,恶心,呕吐,荨麻疹,过敏样反应,心悸,多汗,过敏性休克,头晕,舌麻痹,皮疹,恶心,呕吐,过敏样反应,瘙痒,*胸闷,心悸,皮疹,瘙痒,皮疹,皮疹,皮疹,瘙痒,震颤,过敏样反应,皮疹,过敏样反应,荨麻疹,过敏样反应,红斑疹"
for j = 0 to vbstest
result = F(a)
next
vbsEnd = Timer()
document.write "做完这件事需要" & (vbsEnd - vbsBegin) * 1000 & "豪秒<br>"
document.write result
function F(x)
dim A,S,tag,aaa
S = ","
A = split(x,",")
for each aaa in A
if instr(S,"," & aaa & ",") < 1 then S = S & aaa & ","
next
F = mid(s,2,len(s)-2)
end function
</script>
---------------------------------------------------------------Top
5 楼cwm545(罪人)回复于 2006-03-18 14:00:19 得分 0
pli0825
我的意思是假如有一个数组,里面有以下这些数据:
001;002;aaa;bbb;001;.....
现在需要把它变为(即去掉重反复的并按顺序排列出来)
001;002;aaa;bbb;...
顺序就是要从小到大的排列。
superdullwolf
谢谢你,不过你的只能去掉重复的。
Top
6 楼pli0825(念叨念叨,我念叨死你!)回复于 2006-03-18 17:34:32 得分 0
从小到大??
字符串从小到大??
哪就是按照
ASCII码的顺序排喽。Top
7 楼KimSoft(革命的小酒天天醉-http://blog.csdn.net/kimsoft/)回复于 2006-03-18 18:32:21 得分 3
!!!Top
8 楼hanpoyangtitan(韩波洋)回复于 2006-03-18 18:41:12 得分 3
冒泡法,二分法Top
9 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-19 04:34:55 得分 0
'***********************************************************
sub sortA( Arr)
'堆排序,复杂度n*log(n)/log(2),如果8个数就是24次,如果用冒泡是8^2=64次
dim n,i,L,ir,rArr,j
n = ubound(Arr) '7,8个元素
L = int(n / 2)+1
ir = n
do
if L > 1 then
L = L - 1
rArr = Arr(L)
else
rArr = Arr(ir)
Arr(ir) = Arr(1)
ir = ir - 1
if ir = 1 then
Arr(1) = rArr
exit sub
end if
end if
i = L
j = 2 * L
while j <= ir
if j < ir then
if Arr(j) < Arr(j + 1) then j = j + 1
end if
if rArr < Arr(j) then
Arr(i) = Arr(j)
i = j
j = 2 * j
else
j = ir + 1
end if
wend
Arr(i) = rArr
loop
end sub
Top




