【问题标题】:Permutation put a strict condition from a subsets排列对子集提出了严格的条件
【发布时间】:2019-12-17 17:57:01
【问题描述】:

我应该如何设置一个条件(5 个集合中的 3 个的所有排列。5 个中的任何 2 个,等等。

如果我有:

Me.TextBox1.Text = String.Join(Environment.NewLine, Permutation.Create({"1"c, "2"c, "3"c, "4"c, "5"c}, sort:=False))

输出:(千给我看 5 个中 5 个的排列)。)

12345
12354
12435
12453
12534 and so on...

预期输出:值 = 3(5 个集合中 3 个的所有排列。

123
124
125 
and so on...

我应该如何设置这个条件?

Public NotInheritable Class Permutation

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

    Public Shared Function Create(array As Char(), sort As Boolean) 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)
        If (sort) Then
            list.Sort()
        End If
        Return list
    End Function

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

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

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

    Private Shared Sub Swap(array As Char(), i As Integer, j As Integer)
        Dim tmp As Char
        tmp = array(i)
        array(i) = array(j)
        array(j) = tmp
    End Sub

End Class

由于Int32.MaxValue 的限制,此类将支持级别 1 到 13。

s=1, n=1
s=2, n=2
s=3, n=6
s=4, n=24
s=5, n=120
s=6, n=720
s=7, n=5040
s=8, n=40320
s=9, n=362880
s=10, n=3628800
s=11, n=39916800
s=12, n=479001600
s=13, n=6227020800

用法:Me.TextBox1.Text = String.Join(Environment.NewLine, Permutation.Create({"c"c, "f"c, "a"c, "m"c}, sort:=False))

【问题讨论】:

  • 您是否需要使用您在问题中显示的Permutation 类?如果您不必使用该代码,这似乎可以在几行内实现。
  • 我可以试试看会发生什么。 stackoverflow.com/questions/21084651/… - 我使用了这里的所有东西。

标签: vb.net


【解决方案1】:

你可以通过一些递归来做到这一点:

Sub Main()
    Dim result = GetCombinations({"1"c, "2"c, "3"c, "4"c, "5"c}.ToList(), 3)

    For Each item In result
        Console.WriteLine(String.Concat(item))
    Next
End Sub

Private Function GetCombinations(Of T)(sourceList As IEnumerable(Of T), length As Integer) As IEnumerable(Of IEnumerable(Of T))
    If length = 1 Then Return sourceList.[Select](Function(x) New T() {x})
    Return GetCombinations(sourceList, length - 1).SelectMany(Function(x) sourceList, Function(x1, x2) x1.Concat(New T() {x2}))
End Function

GetCombinations() 函数的工作原理是获取所有长度比列表当前长度小一的组合。它递归地执行此操作,直到列表的长度为 1 - 此时它停止递归。

要获得以逗号分隔的输出,请使用以下内容:

For Each item In result
    Console.WriteLine(String.Join(",", item))
Next

要更改输出字符串的长度,请将初始调用更改为GetCombinations(),例如获取 2 个字符串:

Dim result = GetCombinations({"1"c, "2"c, "3"c, "4"c, "5"c}.ToList(), 2)

【讨论】:

  • 我明白了。效果很好,这样的事情会出现在我身上吗,112 113 114,我可以以某种方式将“,”放在它们之间或空格之间吗?像 1,1,2 和 1,1,3 / 1,1,4 - TextBox1.AppendText(vbCrLf & String.Concat(item))
  • 您可以使用string.join在字符之间添加逗号。例如:String.Join(",", item) 将在 For Each 循环中为您提供逗号分隔的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
相关资源
最近更新 更多