首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

200分:字符串数组处置,有比循环更高效的办法吗

2013-01-06 
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 Const LB_FINDSTRINGEXACT = &H1A2    '在 ListBox 中精确查找

If SendMessagebyString (List1.hWnd, LB_FINDSTRINGEXACT, -1, SearchText) >= 0 Then
    MsgBox "找到了"
Else
    MsgBox "没找到"
End If



 
[解决办法]
还不如都将结果放到一个字符串数组中呢,纯字符串处理个人觉得至少比整个数组往后挪一位快吧。
[解决办法]
引用:
描述:给定一字符串,先判断字符串是否在数组中,若存在则什么都不干;如果不存在,将数组最后一个丢弃,原来的倒数第二个作为最后一个,……,原来的第一个作为第二个,新的字符串放在第一个。

如果用循环,测试代码大致如下:
Private Type myUserType
    Caption As String
    Url As String
End Type
Private myAr……
发现你用listbox控件了,那么直接借助它看看呢,因为它可以直接操作remove掉最后一个List1.RemoveItem List1.ListCount - 1,可以直接添加最新的到第一个List1.AddItem xxx, 0
[解决办法]
No program run faster than no program!
没有任何程序运行的速度比没有程序快!

你为什么不用一个循环队列保存数据呢?
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


[解决办法]
因为数组长度是不变的
首尾接成一个圆圈
只需要记录那个下标是第一个即可
[解决办法]
一个结构,其中一个是数组,一个是头部标识,再来一个成员输出字符串(类似.net里的ToString)
操作的时候根据头部标识操作数组
要整串的时候调用输出字符串的成员函数
[解决办法]
效率,这方面的问题召唤小仙妹过来吧,哈哈.
召唤召唤召唤....200分:字符串数组处置,有比循环更高效的办法吗

热点排行