200分:字符串数组处理,有比循环更高效的办法吗?该怎么处理
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
------解决方案--------------------
------解决方案--------------------
这个问题让人自然而然的想起了链表结构
------解决方案--------------------
字典加链表。 用类来做数据节点,成元是自已这种类,类对象其实可以理解成指针。
------解决方案--------------------
分为两步:
1、将字符串数组的所有字符串组合为一个字符串,假定为:strA;然后将要判断的字符串,假定为:strB。通过instr来判断是否存在。如果存在,那么退出
2、如果不存在,那么做想要处理,同时修改strA
------解决方案--------------------
值得说明的是:strA的组成中,不同的元素之间要加一个分隔符,例如: dd|cc| |是分割符
------解决方案--------------------
------解决方案--------------------
使用一个虚拟的循环数组,需要做的就是维护一个指针。这样,就不需要数组元素之间拷贝。
可以这样理解,逻辑顺序与物理索引有一个反向的映射。
每写入一个新的元素,指针加 1。指针所指的元素,就是逻辑首元素,其他元素顺序减 1。
当指针超过数组大小的时候,取模即可。但此时,访问其他元素,索引小于 0 时需要加上数组大小。
如果你不介意开始元素少于数组大小时读到空串,只需按上述模运算方式。否则,你要维护一个表示元素是否超过数组大小的变量。
还有一个利用 List 控件的方法(这个 List 可以设置为不可见):
1 每次增加一个列表项,都 AddItem strSource, 0(加上索引 0)。
2 将 List 存入数组,以及从数组恢复到 List,都正常操作。
搜索 List 也很方便:
Private Declare Function SendMessagebyString Lib _
"user32" Alias "SendMessageA" (ByVal hWND As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As String) As Long
描述:给定一字符串,先判断字符串是否在数组中,若存在则什么都不干;如果不存在,将数组最后一个丢弃,原来的倒数第二个作为最后一个,……,原来的第一个作为第二个,新的字符串放在第一个。
如果用循环,测试代码大致如下:
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
------解决方案--------------------
------解决方案--------------------
这个问题让人自然而然的想起了链表结构
------解决方案--------------------
字典加链表。 用类来做数据节点,成元是自已这种类,类对象其实可以理解成指针。
------解决方案--------------------
分为两步:
1、将字符串数组的所有字符串组合为一个字符串,假定为:strA;然后将要判断的字符串,假定为:strB。通过instr来判断是否存在。如果存在,那么退出
2、如果不存在,那么做想要处理,同时修改strA
------解决方案--------------------
值得说明的是:strA的组成中,不同的元素之间要加一个分隔符,例如: dd|cc| |是分割符
------解决方案--------------------
------解决方案--------------------
使用一个虚拟的循环数组,需要做的就是维护一个指针。这样,就不需要数组元素之间拷贝。
可以这样理解,逻辑顺序与物理索引有一个反向的映射。
每写入一个新的元素,指针加 1。指针所指的元素,就是逻辑首元素,其他元素顺序减 1。
当指针超过数组大小的时候,取模即可。但此时,访问其他元素,索引小于 0 时需要加上数组大小。
如果你不介意开始元素少于数组大小时读到空串,只需按上述模运算方式。否则,你要维护一个表示元素是否超过数组大小的变量。
还有一个利用 List 控件的方法(这个 List 可以设置为不可见):
1 每次增加一个列表项,都 AddItem strSource, 0(加上索引 0)。
2 将 List 存入数组,以及从数组恢复到 List,都正常操作。
搜索 List 也很方便:
Private Declare Function SendMessagebyString Lib _
"user32" Alias "SendMessageA" (ByVal hWND As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As String) As Long