我正在运行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
答案 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" })
值添加到这些结果中将是微不足道的。