DevX Home    Today's Headlines   Articles Archive   Tip Bank   Forums   

+ Reply to Thread
Results 1 to 2 of 2
  1. #1
    Join Date
    Jan 2004
    Location
    Alexandria, VA
    Posts
    392

    Array analysis problem

    I have an interesting challenge for you all. I have a problem whereby I need to find all possible combinations of the contents of an array, and create a new array with these values. For example, with an array of 3 elements:

    ["A", "B", "C"]

    You would get:

    A
    B
    C
    AB
    BC
    AC
    ABC
    (and of course, none)

    Final count: 2 raised to the power of 3, or an array with 8 elements (different orders of the same combinations don't matter, so we don't differentiate between AC and CA).

    So - I could probably figure out a brute-force method to solve this, but can anyone come up with an elegant solution, assuming that the size and contents of the array is unknown at design time? I was thinking there must be some way to do this recursively, but I haven't quite determined the best approach...

    BTW - no, this is not a classroom assignment...

    Thanks -
    Bob Rouse
    Dimension Data

  2. #2
    Join Date
    Jan 2004
    Location
    Alexandria, VA
    Posts
    392
    Okay, I found a solution, using a recursive function. It's not as clean as I would have liked, but it will suit my purposes. I'm posting it here in case anyone else can benefit from it...

    NOTE: Requires a form with one "Command1" button on it...
    Code:
    Private Sub Command1_Click()
    
        Dim aSource() As String
        Dim aPositions() As String
        Dim aDest() As String
        Dim X As Integer
        Dim strMsg As String
        
        ' Size source array
        ReDim aSource(3)
        
        ' fill with values
        aSource(0) = "A"
        aSource(1) = "B"
        aSource(2) = "C"
        aSource(3) = "D"
        
        ' Call function to get position array
        ReDim aPositions(0)
        ExpandArray 0, UBound(aSource), aPositions()
        
        ' Build destination array based on source and position arrays
        ReDim aDest(UBound(aPositions))
        For X = 0 To UBound(aDest)
        
            ' Fill destination array
            aDest(X) = ArrayPlusPositionToValue(aPositions(X), aSource())
            
            ' just for visual test
            strMsg = strMsg & aDest(X) & vbCrLf
        Next
        
        ' just for visual test
        MsgBox strMsg
        
    End Sub
    
    Public Sub ExpandArray(ByVal intStart As Integer, ByVal intEnd As Integer, ByRef aPositions() As String)
    
        ' Adds entries to array aPositions(), adding value of intStart as a new value,
        ' and adding new entries which are duplicates of existing entries with intStart
        ' added to them
        
        On Error GoTo ErrHandler
        
        Dim X As Integer
        Dim Y As Integer
        Dim intSize As Integer
        Dim intTotal As Integer
        
        ' Get current total entries in the array
        intTotal = UBound(aPositions)
        
        ' Loop through current entries
        For X = 0 To intTotal
        
            ' add array element
            intSize = UBound(aPositions) + 1
            ReDim Preserve aPositions(intSize)
            
            ' add current position
            aPositions(intSize) = aPositions(X) & CStr(intStart)
        Next
        
        ' Move to next position
        intStart = intStart + 1
        
        ' If not past the end, call recursively
        If intStart <= intEnd Then
            ExpandArray intStart, intEnd, aPositions()
        End If
            
        Exit Sub
        
    ErrHandler:
        MsgBox "ERROR in ExpandArray() - " & Err.Description, vbOKOnly + vbCritical, "ERROR"
        
    End Sub
    
    Public Function ArrayPlusPositionToValue(ByVal strPosString As String, ByRef aSource() As String) As String
    
        ' Base on strPosString, where each char is an element position within aSource(),
        ' returns a string which is made up of those elements appended together
        
        On Error GoTo ErrHandler
        
        Dim X As Integer
        Dim strOutString As String
        
        ' Loop through string containing positions
        For X = 1 To Len(strPosString)
        
            ' Add array element to output string
            strOutString = strOutString & aSource(Val(Mid$(strPosString, X, 1)))
            
        Next
        
        ' return the string
        ArrayPlusPositionToValue = strOutString
        
        Exit Function
        
    ErrHandler:
        MsgBox "ERROR in ArrayPlusPositionToValue() - " & Err.Description, vbOKOnly + vbCritical, "ERROR"
        
    End Function
    Bob Rouse
    Dimension Data

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
HTML5 Development Center
 
 
FAQ
Latest Articles
Java
.NET
XML
Database
Enterprise
Questions? Contact us.
C++
Web Development
Wireless
Latest Tips
Open Source


Top DevX Stories

Easy Web Services with SQL Server 2005 HTTP Endpoints
JavaOne 2005: Java Platform Roadmap Focuses on Ease of Development, Sun Focuses on the "Free" in F.O.S.S.
Wed Yourself to UML with the Power of Associations
Microsoft to Add AJAX Capabilities to ASP.NET
IBM's Cloudscape Versus MySQL


Sponsored Links