在Permute函数中重复问题

时间:2016-05-18 01:38:10

标签: vb.net

我正在运行Permute功能,但我遇到了像这样的问题,我怎么能防止这种情况发生呢?

red|red|white
white|red|red

Public buffer As New List(Of String)
Public Sub Permute(ByVal Root As String, ByVal Depth As Integer, ByVal Buffer1 As List(Of String))
    Dim data_array As String() = {"red", "blue", "white"}
    For Each myStr As String In data_array
        If Depth <= 1 Then
            Buffer1.Add(Root & myStr)
        Else
            Permute(Root & myStr & ",", Depth - 1, Buffer1)
        End If
    Next
End Sub

2 个答案:

答案 0 :(得分:1)

Bjørn-Roger Kringsjåthis great answer中将一些C ++代码转换为VB时,为此付出了沉重的代价。

原作用于置换字符串字符。我修改它以使用字符串(我一直有意义),并允许您指定分隔符。您只需返回List(Of String())或类似内容,然后使用调用代码中的String.Join

Public NotInheritable Class Permutation

    Public Shared Function Create(array As String(), sep As String) As List(Of String)
        Return Permutation.Create(array, False, sep)
    End Function

    Public Shared Function Create(array As String(), sort As Boolean,
                                  sep As String) As List(Of String)
        If (array Is Nothing) Then
            Throw New ArgumentNullException("array")
        ElseIf ((array.Length < 0) OrElse (array.Length > 13)) Then
            Throw New ArgumentOutOfRangeException("array")
        End If
        Dim list As New List(Of String)
        Dim n As Integer = array.Length
        Permutation.Permute(list, array, 0, array.Length, sep)
        If (sort) Then
            list.Sort()
        End If
        Return list
    End Function

    Private Shared Sub Permute(list As List(Of String), array As String(),
                               start As Int32, ndx As Int32, sep As String)
        Permutation.Print(list, array, ndx, sep)
        If (start < ndx) Then
            Dim i, j As Integer
            For i = (ndx - 2) To start Step -1
                For j = (i + 1) To (ndx - 1)
                    Permutation.Swap(array, i, j)
                    Permutation.Permute(list, array, (i + 1), ndx, sep)
                Next
                Permutation.RotateLeft(array, i, ndx)
            Next
        End If
    End Sub

    Private Shared Sub Print(list As List(Of String), array As String(),
                             size As Int32, sep As String)
        Dim tmp As New List(Of String)
        If (array.Length <> 0) Then
            For i As Integer = 0 To (size - 1)
                tmp.Add(array(i))
            Next
            list.Add(String.Join(sep, tmp))
        End If
    End Sub

    Private Shared Sub Swap(array As String(), i As Int32, j As Int32)
        Dim tmp As String
        tmp = array(i)
        array(i) = array(j)
        array(j) = tmp
    End Sub

    Private Shared Sub RotateLeft(array As String(), start As Int32, n As Int32)
        Dim tmp As String = array(start)
        For i As Integer = start To (n - 2)
            array(i) = array(i + 1)
        Next
        array(n - 1) = tmp
    End Sub
End Class

注意:我的mods将与Kringsjå先生的原始代码共存为过载。用法:

Dim data = {"red", "blue", "white"}

Dim combos = Permutation.Create(data, ", ")

结果:

  红色,蓝色,白色   红色,白色,蓝色
  蓝色,红色,白色
  蓝色,白色,红色
  白色,红色,蓝色
  白色,蓝色,红色

答案 1 :(得分:0)

您正在做的是选择Can't Edit Audience This audience can't be edited because it was created using settings that are no longer available. You can still use this audience for your ads. To make changes or updates, create a new audience. { "red", "blue", "white" }次之一。因此,如果您致电Depth,您将获得以下内容:

red,red,red,red,red 
red,red,red,red,blue 
...
white,white,white,white,blue 
white,white,white,white,white 

这是3选5的力量。

如果您想获得Permute("", 5, buffer)的所有可能排列,请执行以下操作:

{ "red", "blue", "white" }

......并且这样称呼它:

Public Function Permute(ByVal data As IEnumerable(Of String)) As IEnumerable(Of String)
    If data.Skip(1).Any() Then
        Return data.SelectMany( _
            Function (x) Permute(data.Except({ x })).Select( _
                Function (y) x & "," & y))
    Else
        Return data
    End If
End Function

我得到的结果是:

red,blue,white 
red,white,blue 
blue,red,white 
blue,white,red 
white,red,blue 
white,blue,red 

然后将Dim results = Permute({ "red", "blue", "white" }) 值添加到这些结果中将是微不足道的。