欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp两组字符串数据比较合并相同数据

程序员文章站 2022-07-01 23:38:03
a1="sp2=20;sp1=34;" a2="sp3=2;sp2=3;sp1=4;" 两组字符串数据,将字符串中相同的数据值相加后得到新的一组数据 即“sp3=2;sp2...
a1="sp2=20;sp1=34;"
a2="sp3=2;sp2=3;sp1=4;"
两组字符串数据,将字符串中相同的数据值相加后得到新的一组数据
即“sp3=2;sp2=23;sp1=38”

(p.s 一个简单的应用:商品二原有数量20件,商品一原有数量34件,新进货或者新出售了商品二3件,商品一4件等类型模拟情况下计算出进货量,销售量和库存量,小型的进销存系统可采用这样的方法)

那么如何实现两组字符串数据比较合并相同数据?

第一,将两组字符串数据进行连接组合

a3=a1&a2
那么a3="sp2=20;sp1=34;sp3=2;sp2=3;sp1=4;"

第二,将a3中相同的数据进行值的相加

这里主要解决的是如何寻找到相同的数据

首先因为现在a3就是由 sp2、sp1、sp3、sp2和sp1组成,需要把相同的sp2和sp1单独找出来再进行值得相加。

通过split函数分割“;”为分隔符获得每块数据和值。
即 s_array = split(a3,";")通过for i = 0 to ubound(s_array)循环我们可以获得单独的各项数据及值

其中每项的格式是类似“sp2=20”,要将sp2提取出来才能和同组中的数据进行比较,所以还需要独立函数进行提取

function getspname(sp)
    getspname = split(sp,"=")(0)
end function

function getspnum(sp)
    getspnum = split(sp,"=")(1)
end function

分别获得“=”前的数据名称和“=”后的数据值。

其次每块数据都分解下来了,就是如何寻找到相同的数据名称。
我们假设这样的流程,首先将a3数组中的第一元素提取,通过和除第一元素之前以为的数据进行比较,如果有相同则进行相加。


s_array = split(a3,";")
for i = 0 to ubound(s_array)
    for j=i+1 to ubound(s_array)
        if getspname(s_array(i)) = getspname(s_array(j)) then
        nums = nums + cint(getspnum(s_array(j)))
        end if
    next
next

 

我们获得了最终的值可以随时将值赋到新的动态数组中,组合成最终的“组合数据”数组
redim preserve result(p)
result(p) = getspname(s_array(i)) & "=" & nums



s_array = split(a3,";")
for i = 0 to ubound(s_array)
    for j=i+1 to ubound(s_array)
        if getspname(s_array(i)) = getspname(s_array(j)) then
        nums = nums + cint(getspnum(s_array(j)))
        end if
    next

    redim preserve result(p)
    result(p) = getspname(s_array(i)) & "=" & nums
    p=p+1
next

 


这个里面势必会遇到这样的一个情况:当a3数组中的其后的某一元素总会与之前比较的相同的元素进行了运算,所以该元素就不能计入 for i = 0 to ubound(s_array)内的result(p) = getspname(s_array(i)) & "=" & nums动态数组中去。

如何解决不再运算比较已经被比较运算过的元素

我们必须对已经比较运算过的元素进行标记,比如a3数组中(a3="sp2=20;sp1=34;sp3=2;sp2=3;sp1=4;")取出sp2=20后会比较运算到后一个sp2=3,此时比较运算后将sp2=3的数组元素编号进行标记,下次循环比较时该元素不计在内。


s_array = split(a3,";")
for i = 0 to ubound(s_array)
    for j=i+1 to ubound(s_array)
        if getspname(s_array(i)) = getspname(s_array(j)) then
        nums = nums + cint(getspnum(s_array(j)))
        end if

        redim preserve id(q)
        id(q) = j
        q = q + 1
    next

    redim preserve result(p)
    result(p) = getspname(s_array(i)) & "=" & nums
    p=p+1
next

 

其中定义id(q)=j就是将当前比较相同的该元素标记,并赋值于动态数组id(q),q默认定义为0,再次循环q=q+1
那么有力该标记,我们就可以有选择性的选择比较累加了。
定义函数


function isinid(j)
    dim x
    isinid = false
    for each x in id
        if x = j then 
            isinid = true
            exit function
        end if
    next
end function

 


主要函数为


function mainhb(s)
s_array = split(s,";")
    for i = 0 to ubound(s_array)
        if not isinid(i) then
            nums = getspnum(s_array(i))
            for j=i+1 to ubound(s_array)
                if getspname(s_array(i)) = getspname(s_array(j)) then 
                    nums = nums + cint(getspnum(s_array(j)))
                    redim preserve id(q)
                    id(q) = j
                    q = q + 1
                end if
            next

            redim preserve result(p)
            result(p) = getspname(s_array(i)) & "=" & nums
            p = p + 1
        end if
    next

    for each x in result
        mainhb=mainhb&x&";"
    next
end function

 


整体函数为


<%
dim result()
dim id()
dim p , q , nums

p=0
q= 0 
nums = 0

redim preserve id(q)
id(q) = ""

s = "sp4=33;sp2=20;sp1=34;sp3=2;sp2=3;sp4=4;"
s = left(s,len(s)-1)
response.write mainhb(s)

function mainhb(s)
s_array = split(s,";")
    for i = 0 to ubound(s_array)
        if not isinid(i) then 
            nums = getspnum(s_array(i))
            for j=i+1 to ubound(s_array)
                if getspname(s_array(i)) = getspname(s_array(j)) then 
                    nums = nums + cint(getspnum(s_array(j)))
                    redim preserve id(q)
                    id(q) = j
                    q = q + 1
                end if
            next

            redim preserve result(p)
            result(p) = getspname(s_array(i)) & "=" & nums
            p = p + 1
        end if
        'nums = 0
    next

    for each x in result
        mainhb=mainhb&x&";"
    next
end function

function getspname(sp)
    getspname = split(sp,"=")(0)
end function


function getspnum(sp)
    getspnum = split(sp,"=")(1)
end function

function isinid(j)
    dim x
    isinid = false
    for each x in id
        if x = j then 
            isinid = true
            exit function
        end if
    next
end function
%>