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
[解决办法]
Const MAXITEMS = 1000
Dim a(0 To MAXITEMS - 1) As String
Dim h As Long '头
Dim t As Long '尾
Dim n As Long '总数
Dim i As Long
Dim p As Long
Private Sub insertitem(s As String)
'无条件插入字符串s到数组a中
a(t) = s
t = (t + 1) Mod MAXITEMS
n = n + 1
End Sub
Private 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 If
End Sub
Private Sub listitem()
p = h
For i = 1 To n
Debug.Print a(p);
p = (p + 1) Mod MAXITEMS
Next
Debug.Print
End Sub
Private 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"
listitem
End Sub
'点击按钮Command1后立即窗口中的结果
a
ab
abc
abc
xab
yxa
yxa
zyx