首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成多个数组的所有排列/组合?

如何生成多个数组的所有排列/组合?
EN

Stack Overflow用户
提问于 2014-02-17 22:19:49
回答 5查看 10K关注 0票数 2

我的目标很简单,我试图为数据库中的产品生成所有可能组合的列表。

例如,产品选项如下

  • 产品选项:颜色/价值:红色,绿色,蓝色
  • 产品选项:大小/值:小,地中海,大,XL
  • 产品选择:款式/价值观:男性、女性

我希望能够自动生成所有3种组合的每一个组合:

代码语言:javascript
复制
Small, Red, Mens
Small, Green, Mens
Small, Blue, Mens
etc

无论将2、3、4或5个数组传递到其中,我都需要该函数来工作。

我做了相当多的研究,并遇到了以下文章,但未能完成我的目标。

我发现的文章如下:

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-02-17 22:24:52

在笛卡尔产品上修改埃里克·利珀特的博客的代码:

代码语言:javascript
复制
Private Function CartesianProduct(Of T)(ParamArray sequences As T()()) As T()()

    ' base case: 
    Dim result As IEnumerable(Of T()) = {New T() {}}
    For Each sequence As var In sequences
        Dim s = sequence
        ' don't close over the loop variable 
        ' recursive case: use SelectMany to build the new product out of the old one 
        result = From seq In result
                 From item In s
                 Select seq.Concat({item}).ToArray()
    Next
    Return result.ToArray()
End Function

用法:

代码语言:javascript
复制
Dim s1 As String() = New String() {"small", "med", "large", "XL"}
Dim s2 As String() = New String() {"red", "green", "blue"}
Dim s3 As String() = New String() {"Men", "Women"}

Dim ss As String()() = CartesianProduct(s1, s2, s3)
票数 4
EN

Stack Overflow用户

发布于 2014-02-17 22:30:21

三个循环--一个在另一个里面--应该能起作用。

所以伪代码..。

代码语言:javascript
复制
For each value in sex array
    For each value in size array
        For each value in colour array
          Output sex, size, colour values
        Next colour
    Next size
Next sex

更新的Psudo

代码语言:javascript
复制
Sub ouputOptions(array1, array2, array3, array4, array5)
    For each value in array1
        For each value in array2
            If array3 Not Nothing Then
                For each value in array3
                    If array4 Not Nothing Then
                        For each value in array4
                            If array5 Not Nothing Then
                                For each value in array5
                                    output array1, array2, array3, array4, array5 values
                                next array5
                            Else
                                Output array1, array2, array3, array4 values
                            End if
                        Next array4
                    Else
                        Output array1, array2, array3 values
                    End if
                next array3
            Else
                Output array1, array2 values
            End if
        Next array2
    Next array1
End Sub

您需要将array3指定为5作为可选的

票数 0
EN

Stack Overflow用户

发布于 2014-02-17 23:14:24

您可以通过一些递归来实现这一点。

下面是返回字符串数组的结果。

代码语言:javascript
复制
Public class Permuter

    Public Function Permute(ParamArray toPermute As String()()) As String()()

        Return DoPermute(Nothing, toPermute)

    End Function

    ''' <summary>
    ''' Permute the first two arrays,then pass that, and the remainder recursively
    ''' </summary>
    Private Function DoPermute(working As String()(), toPermute As String()()) As String()()

        Dim nextWorking As String()()

        If working Is Nothing Then

            'Make a new working list
            nextWorking = (From a In toPermute(0)
                       Select {a}).ToArray

        Else

            'Combine from the next working list
            nextWorking = (From a In working, b In toPermute(0)
                          Select a.Concat({b}).ToArray).ToArray

        End If

        If toPermute.Length > 1 Then

            'Go Around again

            Dim nextPermute = toPermute.Skip(1).ToArray

            Return DoPermute(nextWorking, nextPermute)

        Else

            'We're done
            Return nextWorking

        End If

    End Function

End Class

将公共方法称为:

代码语言:javascript
复制
Dim permuter = New Permuter
Dim permutations = permuter.Permute({"a", "b", "c"}, {"1", "2", "3"}, {"x", "y", "z"})

更新:使用@DStanley的Eric博客引用,下面是那个职位中提到的累加器方法的转换

代码语言:javascript
复制
Public Function CartesianProduct(Of T)(ParamArray sequences As T()()) As IEnumerable(Of IEnumerable(Of T))

    Dim emptyProduct As IEnumerable(Of IEnumerable(Of T)) = {Enumerable.Empty(Of T)()}

    Return sequences.Aggregate(
            emptyProduct,
            Function(accumulator, sequence) _
                From accseq In accumulator, item In sequence
                Select accseq.Concat({item})
        )

End Function

请注意,这将返回延迟查询,而不是一组扩展的数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21840430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档