200分:字符串数组处理,有比循环更高效的办法吗?
描述:给定一字符串,先判断字符串是否在数组中,若存在则什么都不干;如果不存在,将数组最后一个丢弃,原来的倒数第二个作为最后一个,……,原来的第一个作为第二个,新的字符串放在第一个。
如果用循环,测试代码大致如下:
Private Type myUserType
Caption As String
Url As String
End Type
Private myArray(1 To 20) As myUserType '这样定义简便,实际使用中是用这样的结构,实在不行就分别定义两个数组
Private Sub Command1_Click()
Dim bExist As Boolean '给定的字符串是否存在于数组中,即是否重复了
Dim sUrlStr As String '给定的字符串
Dim i As Long
sUrlStr = Text1.Text
If sUrlStr = "" Then Exit Sub
For i = 1 To 20
If myArray(i).Url = sUrlStr Then
bExist = True '和现有的重复了
Exit For
End If
Next
If bExist = False Then '若没有重复
For i = 20 To 2 Step -1
myArray(i).Caption = myArray(i - 1).Caption
myArray(i).Url = myArray(i - 1).Url
Next
myArray(1).Caption = "Caption" & sUrlStr
myArray(1).Url = sUrlStr
Call addDataToList
End If
End Sub
Private Sub Form_Load()
Dim i As Long
For i = 1 To 20
myArray(i).Caption = "Caption" & CStr(i)
myArray(i).Url = "Url" & CStr(i)
Next
Call addDataToList
End Sub
Private Sub addDataToList()
Dim i As Long
List1.Clear
For i = 1 To 20
List1.AddItem myArray(i).Caption & "//" & myArray(i).Url
Next
End Sub
就不知道是否有更高效的办法?应该说几十个元素的数组,用循环也慢不到哪里去,但当CPU负荷已经很高的时候……,能快还是快点吧。
[解决办法]
字典试试
[解决办法]
看起来,你需要的是在一个固定大小的数组里循环,就像一个圆盘,循环的改变起始的位置
你可以定义一个模块变量TheFirst,用于指示数组中,哪个单元作为第一个单元,
当你判断一个字串不在数组中,那么,你就将最后一个单元赋予新字串的值,然后,TheFirst赋值为该单元的下标(上次的最后一个,变为这次的第一个(园循环))
比如原来为1-20 ,TheFirst=1,最后一个为20,新字串加入后,TheFirst变为20,最后单元变为19
再次加入TheFirst变为19,最后单元为18
.....
这样,你不断的加入新字串,TheFirst不断减少,变到第一个单元后,则再次加入,TheFirst又变为20
按照这个逻辑,你只要判断字串是否在数组中
将字串存入TheFirst-1位置(注意,如果值小于第一个单元,则变为最后单元)
TheFirst修改为TheFirst-1
[解决办法]
Private Const LB_FINDSTRINGEXACT = &H1A2 '在 ListBox 中精确查找
If SendMessagebyString (List1.hWnd, LB_FINDSTRINGEXACT, -1, SearchText) >= 0 Then
MsgBox "找到了"
Else
MsgBox "没找到"
End If
[解决办法]
还不如都将结果放到一个字符串数组中呢,纯字符串处理个人觉得至少比整个数组往后挪一位快吧。
[解决办法]
Const MAXITEMS = 1000Dim a(0 To MAXITEMS - 1) As StringDim h As Long '头Dim t As Long '尾Dim n As Long '总数Dim i As LongDim p As LongPrivate Sub insertitem(s As String)'无条件插入字符串s到数组a中 a(t) = s t = (t + 1) Mod MAXITEMS n = n + 1End SubPrivate Sub additem(s As String)'先判断字符串s是否在数组a中,若存在则什么都不干;'如果不存在,将数组a最后一个丢弃,原来的倒数第二个作为最后一个,……,原来的第一个作为第二个,新的字符串s放在第一个。 If n > 0 Then p = h For i = 1 To n If a(p) = s Then Exit For p = (p + 1) Mod MAXITEMS Next If i > n Then t = (t + MAXITEMS - 1) Mod MAXITEMS h = (h + MAXITEMS - 1) Mod MAXITEMS a(h) = s End If Else h = 0 t = 0 a(t) = s t = (t + 1) Mod MAXITEMS n = 1 End IfEnd SubPrivate Sub listitem() p = h For i = 1 To n Debug.Print a(p); p = (p + 1) Mod MAXITEMS Next Debug.PrintEnd SubPrivate Sub Command1_Click() insertitem "a" listitem insertitem "b" listitem insertitem "c" listitem additem "c" listitem additem "x" listitem additem "y" listitem additem "a" listitem additem "z" listitemEnd Sub'点击按钮Command1后立即窗口中的结果aababcabcxabyxayxazyx
[解决办法]
因为数组长度是不变的
首尾接成一个圆圈
只需要记录那个下标是第一个即可
[解决办法]
一个结构,其中一个是数组,一个是头部标识,再来一个成员输出字符串(类似.net里的ToString)
操作的时候根据头部标识操作数组
要整串的时候调用输出字符串的成员函数
[解决办法]
效率,这方面的问题召唤小仙妹过来吧,哈哈.
召唤召唤召唤....