一个数组A(),数组元素为以"-"分隔的字符串,如
A(0)="a-b-c"
A(1)="1-2"
A(2)="A-Z"
……
现在要把数组元素中的以"-"分隔的部分作为元素与别的数组元素中以"-"分隔的部分做组合(每个数组元素提供一个部分),如果能计算输出所有组合?例如上面的数组A,要输出所有组合的结果:
a_1_A
b_1_A
c_1_A
a_2_A
b_2_A
c_2_A
a_1_Z
b_1_Z
c_1_Z
a_2_Z
b_2_Z
c_2_Z请问这个程序要怎么写?

解决方案 »

  1.   

    split我想到了,但全排列我不会写,请指点一下?
      

  2.   

    如:Private Sub Form_Load()
        Dim i As Long, j As Long, k As Long
        Dim A0(), A1(), A2
        A0 = Split(A(0), "-")
        A1 = Split(A(1), "-")
        A2 = Split(A(2), "-")
        For i = 0 To UBound(A0)
            For j = 0 To UBound(A1)
                For k = 0 To UBound(A2)
                    Debug.Print A0(i) & "_" & A1(j) & "_"; A2(k)
                Next
            Next
        Next
    End Sub
      

  3.   

    Private Sub Form_Load()
    Dim A(3) As String
    Dim i As Integer, j As Integer, m As Integer, n As Integer, l As Integer, k As Integer
    A(0) = "a-b-c"
    A(1) = "1-2"
    A(2) = "A-Z"
    A(3) = "3 - 4"
    Dim b() As String, b1() As String, b2() As String, b3() As String
    Dim C
    For i = 0 To UBound(A)
    C = Split(A(i), "-")
    For j = 0 To UBound(C)
    ReDim Preserve b(k)
     b(k) = C(j)
    k = k + 1
    Next
    Next
    For i = 0 To UBound(b)
    s = Asc(b(i))
    Select Case s
    Case 48 To 57
    ReDim Preserve b1(m)
     b1(m) = b(i)
    m = m + 1
    Case 97 To 122
    ReDim Preserve b2(n)
     b2(n) = b(i)
    n = n + 1
    Case 65 To 90
    ReDim Preserve b3(l)
     b3(l) = b(i)
    l = l + 1
    End Select
    Next
    For i = 0 To UBound(b1)
            For j = 0 To UBound(b2)
                For k = 0 To UBound(b3)
                    Debug.Print b2(i) & "-" & b1(j) & "-" & b3(k)
                Next
            Next
        NextEnd Sub
      

  4.   

    不定长数组要用递归Dim a() As StringPrivate Sub Command1_Click()    ReDim a(2)
        
        a(0) = "a-b-c"
        a(1) = "1-2"
        a(2) = "A-Z"
        
        Call GetNewOrder(0, "")
        
    End Sub
    Private Sub GetNewOrder(ByVal intNum As Integer, ByVal strTemp As String)
        Dim b() As String
        Dim i As Integer
        Dim strMy As String
        
        b = Split(a(intNum), "-")    
        For i = 0 To UBound(b)
            strMy = strTemp & IIf(intNum = 0, "", "_") & b(i)
            
            If intNum < UBound(a) Then
                Call GetNewOrder(intNum + 1, strMy)
            Else
                Debug.Print strMy
            End If
        Next i
        
    End Sub结果
    a_1_A
    a_1_Z
    a_2_A
    a_2_Z
    b_1_A
    b_1_Z
    b_2_A
    b_2_Z
    c_1_A
    c_1_Z
    c_2_A
    c_2_Z
      

  5.   

    简言之,递归过程就是子程序自己调用自己b = Split(a(intNum), "-") 
    ---------------------------------  
    分离a(i)得到数组b
    a(0)  "a-b-c" 
    ——〉
    b(0) "a"
    b(1) "b"
    b(2) "c"
      

  6.   

    IIf(intNum = 0, "", "_") 
    -------------------------判断是否是字符串起始,如果是则不加"_"
    不要这个  _a_1_A 
    要这个     a_1_A   
      

  7.   

    Private Sub GetNewOrder(ByVal intNum As Integer, ByVal strTemp As String)
        Dim b() As String
        Dim i As Integer
        Dim strMy As String
        
        b = Split(a(intNum), "-")   '分离a(i)得到数组b,a(0)  "a-b-c" ——〉b(0) "a",b(1) "b",b(2) "c"    
        For i = 0 To UBound(b)
            strMy = strTemp & IIf(intNum = 0, "", "_") & b(i)   '连接字符串
            
            If intNum < UBound(a) Then    '判断是否到a数组最后,没到继续调用,到打印
                Call GetNewOrder(intNum + 1, strMy)  '调用自身,递归的主要部分
            Else
                Debug.Print strMy
            End If
        Next i
        
    End Sub