数组排序和交集

13 篇文章 0 订阅
2 篇文章 0 订阅

由于工作需求,需要在SQL查询结果的字符串中找出相同的数字,

表名:Table
结构如下:
id, Title, Content
1, A, nvarchar(max)
2, B, nvarchar(max)

其中Content中存的是以逗号相隔的数字,数字顺序排列,不会重复,单条的数据量非常大,几万级别,格式如下:
1,23,45,678,2323,2615,6325,23232......
32,45,128,2323,2615,2861,13512,16802.......

现在要处理的是:
在上面查询到的2个结果中,将Content里面的值相同的数字取出来,并存为以下格式:
45,2323,2615

解决思路:

1、排序:由于字符串是由数字组成,先对查询结果的字符串中的数字进行排序处理,排序函数VBS代码如下:

'排序
Function SortNum(NumList)
	Dim oArrayList, iElement
	Set oArrayList = CreateObject("System.Collections.ArrayList")
	Dim thisArray
	thisArray = Split(NumList, ",")
	For iElement = 0 To UBound(thisArray)
		oArrayList.Add CLng(thisArray(iElement))
	Next
	oArrayList.Sort		'通过ArrayList的Sort方法对数组进行排序
	thisArray = oArrayList.toArray
	SortNum = join(thisArray, ",")		'返回字符串
End Function
如果数字是有规则的顺序排序的话,则不需要使用此排序函数。
http://blog.csdn.net/aminfo/article/details/22955059

2、交集:将排序好的字符串转换成数组,然后进行交集处理,以下为交集函数vbs代码:

'对2组字符串进行交集处理
Function GetSameNum(IdStrA, IdStrB)
	GetSameNum = ""

	Dim tmpArrayA, tmpArrayB
	Dim ALength, BLength
	Dim iA, iB

	tmpArrayA = Split(IdStrA, ",")		'将字符串转为数组
	ALength = ubound(tmpArrayA)
	iA = 0

	tmpArrayB = Split(IdStrB, ",")		'将字符串转为数组
	BLength = ubound(tmpArrayB)
	iB = 0

	do while True
		If iA>ALength Then
			Exit Do
		ElseIf iB>BLength Then
			Exit Do
		End If

		ValueA = Clng(tmpArrayA(iA))
		ValueB = Clng(tmpArrayB(iB))

		do while ValueA > ValueB
			iB = iB + 1			
			If iB > BLength Then
				Exit Do
			End If
			ValueB = Clng(tmpArrayB(iB))
		Loop
		do while ValueA < ValueB
			iA = iA + 1			
			If iA > ALength Then
				Exit Do
			End If
			ValueA = Clng(tmpArrayA(iA))
		Loop
		If ValueA = ValueB Then
			GetSameNum = GetSameNum & "," & ValueA
			iA = iA + 1
			iB = iB + 1
		End If
	Loop
	
	If GetSameNum<>"" Then
		GetSameNum = Right(GetSameNum, Len(GetSameNum)-1)
	End If	
End Function


测试结果:
字符串A转为数组后长度为:51271
字符串B转为数组后长度为:79017

将以上两个字符串进行交集处理所消耗时间:179.688毫秒



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值