这个问题做起来很简单,比较容易完成,可是要提高速度却让我头疼
希望高手能给出您最好的方法,问题如下:
有给定的几个字符串变量,这里就假定是3个吧
每个的字符串内包含的字符都一样多
不妨假设如下:
dim a(3) as string,i as long,strLast as string,nLen as long
a(0)="0123456789"
a(1)="abcdefghij"
a(2)="ABCDEFGHIJ"
现在要从每个字符变量中按顺序逐个取出字符并组合在一起,成为一个字符
我的做法如下:
nLen=len(a(0))
for i=1 to nLen
   strLast=strLast & mid(a(0),i,1)
   strLast=strLast & mid(a(1),i,1)
   strLast=strLast & mid(a(2),i,1)
next
处理后的效果如下:
strLast="0aA1bB2cC3dD4eE5fF6gG7hH8iI9jJ"
这个是我需要的结果,但是这样做起来很慢,因为我要处理的字符串很大
a(0)、a(1)、a(2)的长度都很长,大概a(0)包含的字符保存起来有15K左右那么大,在这种情况下,我的方法就不好了,速度很慢,请问各位高手,有没有别的什么方法可以提高速度的?
另外还问个问题,用API如何完成同mid()函数一样功能?
请知道的朋友帮我一把,在此谢谢了!

解决方案 »

  1.   

    速度慢的关键不是mid,而是&
      

  2.   

    Private Sub Command1_Click()
        Dim a(3) As String
        Dim i As Long
        Dim strLast As String
        Dim nLen As Long
        Dim s1() As Byte
        Dim s2() As Byte
        Dim s3() As Byte
        
        a(0) = "0123456789"
        a(1) = "abcdefghij"
        a(2) = "ABCDEFGHIJ"
        
        s1 = StrConv(a(0), vbFromUnicode)
        s2 = StrConv(a(1), vbFromUnicode)
        s3 = StrConv(a(2), vbFromUnicode)
        
        For i = LBound(s1) To UBound(s1)
            strLast = strLast + Chr(s1(i))
            strLast = strLast + Chr(s2(i))
            strLast = strLast + Chr(s3(i))
            
            strLast = Trim(strLast)
        Next i
        
        Debug.Print strLast
    End Sub
      

  3.   

    使用二维数组:
    a(0,0)="0";a(0,1)="1";a(0,2)="2";a(0,3)="3";a(0,4)="4";...
    a(1,0)="a";a(1,1)="b";a(1,2)="c";a(1,3)="d";a(1,4)="e";...
    a(2,0)="A";a(2,1)="B";a(2,2)="C";a(2,3)="D";a(2,4)="E";...
    ...
    for i=1 to nLen
       strLast=strLast & a(0,i) & a(1,i) & a(2,i)
    next
    这样就可以了。
      

  4.   

    nLen=len(a(0))
    stringS=a(0) & a(1) & a(2)
    for i=1 to nLen
       strLast=strLast & mid(stringS,i,1) & mid(stringS,nLen+i,1) & mid(stringS,nLen+nLen+i,1)
    next
      

  5.   

    我都用过了,把 & 换成 + ,结果速度提升不明显
    用信息男孩的方法,提升了9%的速度,我的方法用了559ms,他的方法用了497ms
    用冰儿马甲的方法,提升速度最明显,可是有中文的情况下就没方法了。
    测试的本文长度为50K。马甲啊马甲,请你给出可以兼容中文的方法啊!!
    冰儿马甲,请给出兼容中文的方法啊!
      

  6.   

    KiteGirl
    可以写一下吗?
    我正在等待中啊!
    迫切、急切、殷切等待中
      

  7.   

    do循环比For循环能快些
    也可以不用一个循环分几步来运算
      

  8.   

    再用 strconv(strLast, vbFromUnicode)转回去不行么?
      

  9.   

    如果是混合的话就比较麻烦勒,使用API也不太好处理中文字符的问题,不过你可以从api着手看看,现在我出差中,手边没有MSDN。
      

  10.   

    不知道快不快
    Private Sub Command1_Click()Dim a(3) As String, i As Long
    Dim strLast As String, nLen As Long
    a(0) = "0123456789"
    a(1) = "abcdefghij"
    a(2) = "ABCDEFGHIJ"
    nLen = Len(a(0))Dim tmp() As String, x As Long, w As Long
    w = UBound(a)
    x = nLen * w - 1
    ReDim tmp(x) As String
    For i = 0 To x
    tmp(i) = Mid$(a(i Mod w), i \ w + 1, 1)
    Next i
    strLast = Join(tmp, "")Debug.Print strLastEnd Sub
      

  11.   

    写错了
    Private Sub Command1_Click()Dim a(3) As String, i As Long
    Dim strLast As String, nLen As Long
    a(0) = "0123456789"
    a(1) = "abcdefghij"
    a(2) = "ABCDEFGHIJ"
    a(3) = "一二三四五六七八九十"
    nLen = Len(a(0))Dim tmp() As String, x As Long, w As Long
    w = UBound(a) + 1
    x = nLen * w - 1
    ReDim tmp(x) As String
    For i = 0 To x
    tmp(i) = Mid$(a(i Mod w), i \ w + 1, 1)
    Next i
    strLast = Join(tmp, "")Debug.Print strLastEnd Sub
      

  12.   

    看看是不是合乎你的需要:
    提示:将abcdef & ABCDEF & 1234567后再交给该函数。
    Private Sub Command1_Click()
      Text1.Text = StringGet("小楼楼仙上主妹的也是都是个是个好大大孩笨苯子蛋蛋", 3)
    End SubFunction StringGet(ByRef pString As String, ByVal pWidth As Long) As String
      
      Dim tHeight As Long
      
      Dim tBytes() As Byte
      Dim tBytes_Length As Byte
      
      tBytes() = pString
      tBytes_Length = UBound(tBytes())
      
      tHeight = ((tBytes_Length + 1) \ (2 * pWidth))
      
      Dim tIndex As Long
      Dim tIndexLength As Long
      
      Dim tGetX As Long
      Dim tGetY As Long
      Dim tGetIndex As Long
      Dim tOutBytes() As Byte
      
      tIndexLength = pWidth * tHeight * 2 - 1
      ReDim tOutBytes(tIndexLength)
      
      For tIndex = 0 To tIndexLength
        tGetX = (tIndex \ (2 * tHeight)) * 2 + (tIndex Mod 2)
        tGetY = ((tIndex \ 2) Mod tHeight)
        tGetIndex = (tGetY * 2 * pWidth) + tGetX
        tOutBytes(tIndex) = tBytes(tGetIndex)
      Next
      
      StringGet = tOutBytes()
    End Function
      

  13.   

    其实关键是导出输出串Oi对应输入串Si的字节位置的公式,主要难点就在这里。H = Smax \ W
    Sx = (Oi \ (2 * H)) * 2 + (Oi Mod 2)
    Sy = ((Oi \ 2) Mod H)
    Si = (Sy * 2 * W) + Sx
      

  14.   

    根据我的经验:用Byte数组操作,速度比字符串操作要快。但这个函数没有经过验证,不清楚是否是这样。如果你要测试速度,请编译后测试一下。
      

  15.   

    哈哈~
    Private Sub Command1_Click()Dim a(2) As String, i As Long
    Dim strLast As String, nLen As Long
    a(0) = "小仙妹是个好孩子"
    a(1) = "楼上的都是大笨蛋"
    a(2) = "楼主也是个大笨蛋"
    nLen = Len(a(0))Dim tmp() As String, x As Long, w As Long
    w = UBound(a) + 1
    x = nLen * w - 1
    ReDim tmp(x) As String
    For i = 0 To x
    tmp(i) = Mid$(a(i Mod w), i \ w + 1, 1)
    Next i
    strLast = Join(tmp, "")Debug.Print strLastEnd Sub
    Debug结果:小楼楼仙上主妹的也是都是个是个好大大孩笨笨子蛋蛋
      

  16.   

    ’这样应该快一些
      Dim S(2) As String
        Dim S2() As String
        Dim S3 As String
        
        Dim L As Long
        Dim i As Long
        
        S(0) = "12345678"
        S(1) = "abcdefgh"
        S(2) = "ABCDEFGH"
        
        L = Len(S(0))
        ReDim S2(L)
       
        For i = 1 To L
            S2(i) = Mid(S(0), i, 1) & Mid(S(1), i, 1) & Mid(S(2), i, 1)
        Next
        S3 = Join(S2(), "")