Vb.net所有组合

Vb.net所有组合,vb.net,combinations,Vb.net,Combinations,我有6个项目需要组合 列出的项目:(这是一个示例) 类人猿 母牛 鹿|小鹿|大鹿 羊 所以“鹿”有两个子项 这些项目都列在如下列表中: 类人猿 母牛 {鹿|小鹿|大鹿} 羊 所以你可以看到哪个项目有更多的项目 我想要的是所有这些组合: 类人猿 奶牛 鹿 羊 类人猿 奶牛 小鹿 羊 类人猿 母牛 大鹿 羊 (有时多于6项,有时少于6项 有人能帮我吗 编辑: 有时列表也是这样的: 类人猿 母牛 鹿|小鹿|大鹿 羊 老鼠|黑老鼠|白老鼠 (所以更多的项目包含子项目)您需要我的解决方案的一

我有6个项目需要组合

列出的项目:(这是一个示例)

  • 类人猿
  • 母牛
  • 鹿|小鹿|大鹿
所以“鹿”有两个子项

这些项目都列在如下列表中:

类人猿 母牛 {鹿|小鹿|大鹿} 羊

所以你可以看到哪个项目有更多的项目

我想要的是所有这些组合:

  • 类人猿 奶牛 鹿 羊

  • 类人猿 奶牛 小鹿 羊

  • 类人猿 母牛 大鹿 羊

(有时多于6项,有时少于6项

有人能帮我吗

编辑:

有时列表也是这样的:

  • 类人猿
  • 母牛
  • 鹿|小鹿|大鹿
  • 老鼠|黑老鼠|白老鼠

(所以更多的项目包含子项目)

您需要我的解决方案的一个变体,我在一个类似的问题中介绍了这个变体。也许它足以让您满意

也许你不允许看到答案,所以我把它复制到这里。有人想要所有长度为3的1和2的组合

   Dim HighestValue As Integer = 2 ' max value
    Dim NrOfValues As Integer = 3 ' nr of values in one result
    Dim Values(NrOfValues) As Integer
    Dim i As Integer
    For i = 0 To NrOfValues - 1
        Values(i) = 1
    Next
    Values(NrOfValues - 1) = 0 ' to generate first as ALL 1
    For i = 1 To HighestValue ^ NrOfValues
        Values(NrOfValues - 1) += 1
        For j As Integer = NrOfValues - 1 To 0 Step -1
            If Values(j) > HighestValue Then
                Values(j) = 1
                Values(j - 1) += 1
            End If
        Next
        Dim Result As String = ""
        For j As Integer = 0 To NrOfValues - 1
            Result = Result & CStr(Values(j))
        Next
        Debug.WriteLine(Result)
    Next

您需要将数组值按1、2等索引,而不是数字本身,并为每个子列表创建一个类似的操作。

我无法对@Martin提供的方法发表评论,因为我不是专家交换的成员,但下面是我将如何处理该问题的方法

你想要一个IEnumerable(of IEnumerable(of T))

当你有“Ape”时,你需要把它想象成{Ape}。这就是你的清单:

{Ape}, {Cow}, {鹿,小鹿,大鹿}, {绵羊}

在此基础上,通过对外部列表进行分组并遍历内部列表来构建组合

也就是说,第一个项目{Ape}只有一个元素,因此您只会对该元素迭代一次。对于{Cow}也是如此,但是对于所有deer,第三个项目将迭代3次


这就足够让您开始了。

这里有一个针对VB 2010的递归解决方案(当有很多组合时,性能可能不是很好,但这是一个开始):

测试输出:

Ape, Cow, Deer, Sheep, Mouse
Ape, Cow, Deer, Sheep, Black Mouse
Ape, Cow, Deer, Sheep, White mouse
Ape, Cow, Small deer, Sheep, Mouse
Ape, Cow, Small deer, Sheep, Black Mouse
Ape, Cow, Small deer, Sheep, White mouse
Ape, Cow, Big deer, Sheep, Mouse
Ape, Cow, Big deer, Sheep, Black Mouse
Ape, Cow, Big deer, Sheep, White mouse

想要以字符串形式输入?而不是递归?那么这里是最终的解决方案,是对我之前的示例的简单改编:

    Dim Lines As New List(Of List(Of String))
    AddItem(Lines, "a ")
    AddItem(Lines, "b ")
    AddItem(Lines, "c1|c2|c3 ")
    AddItem(Lines, "d ")
    AddItem(Lines, "e1|e2")
    AddItem(Lines, "f ") ' etc
    Dim i As Integer
    Dim j As Integer
    Dim ItemnrInLine(Lines.Count - 1) As Integer
    Dim NrCombinations = 1
    For i = 0 To (Lines.Count - 1)
        ItemnrInLine(i) = 0
        NrCombinations *= Lines(i).Count
    Next
    ItemnrInLine(Lines.Count - 1) = -1 ' to get first combination as solution
    For i = 1 To NrCombinations
        ItemnrInLine(Lines.Count - 1) += 1
        For j = Lines.Count - 1 To 0 Step -1
            If ItemnrInLine(j) = Lines(j).Count Then
                ItemnrInLine(j) = 0
                ItemnrInLine(j - 1) += 1
            End If
        Next
        printOut(Lines, ItemnrInLine)
    Next

Sub printOut(ByVal Lines As List(Of List(Of String)), ByVal ItemnrInLine() As Integer)
    Dim Result As String = ""
    For k = 0 To Lines.Count - 1
        Result = Result & Lines(k)(ItemnrInLine(k)).Trim & " "
    Next
    Debug.WriteLine(Result)
End Sub

Sub AddItem(ByVal Lines As List(Of List(Of String)), ByVal inputString As String)
    Dim words() As String = inputString.Split("|"c)
    Dim wordList As New List(Of String)
    For i As Integer = 0 To words.Count - 1
        wordList.Add(words(i))
    Next
    Lines.Add(wordList)
End Sub

在最后一个例子中,您想要9行输出?我还有一个问题。我得到了一个字符串列表,其中包括我在开始时说的项,如何将它们转换为dim items=(这里是所有这些项)。对于列表中的每个字符串,使用字符“|”调用Split方法作为分隔符,并使用ToArray方法将结果转换为数组。
Ape, Cow, Deer, Sheep, Mouse
Ape, Cow, Deer, Sheep, Black Mouse
Ape, Cow, Deer, Sheep, White mouse
Ape, Cow, Small deer, Sheep, Mouse
Ape, Cow, Small deer, Sheep, Black Mouse
Ape, Cow, Small deer, Sheep, White mouse
Ape, Cow, Big deer, Sheep, Mouse
Ape, Cow, Big deer, Sheep, Black Mouse
Ape, Cow, Big deer, Sheep, White mouse
    Dim Lines As New List(Of List(Of String))
    AddItem(Lines, "a ")
    AddItem(Lines, "b ")
    AddItem(Lines, "c1|c2|c3 ")
    AddItem(Lines, "d ")
    AddItem(Lines, "e1|e2")
    AddItem(Lines, "f ") ' etc
    Dim i As Integer
    Dim j As Integer
    Dim ItemnrInLine(Lines.Count - 1) As Integer
    Dim NrCombinations = 1
    For i = 0 To (Lines.Count - 1)
        ItemnrInLine(i) = 0
        NrCombinations *= Lines(i).Count
    Next
    ItemnrInLine(Lines.Count - 1) = -1 ' to get first combination as solution
    For i = 1 To NrCombinations
        ItemnrInLine(Lines.Count - 1) += 1
        For j = Lines.Count - 1 To 0 Step -1
            If ItemnrInLine(j) = Lines(j).Count Then
                ItemnrInLine(j) = 0
                ItemnrInLine(j - 1) += 1
            End If
        Next
        printOut(Lines, ItemnrInLine)
    Next

Sub printOut(ByVal Lines As List(Of List(Of String)), ByVal ItemnrInLine() As Integer)
    Dim Result As String = ""
    For k = 0 To Lines.Count - 1
        Result = Result & Lines(k)(ItemnrInLine(k)).Trim & " "
    Next
    Debug.WriteLine(Result)
End Sub

Sub AddItem(ByVal Lines As List(Of List(Of String)), ByVal inputString As String)
    Dim words() As String = inputString.Split("|"c)
    Dim wordList As New List(Of String)
    For i As Integer = 0 To words.Count - 1
        wordList.Add(words(i))
    Next
    Lines.Add(wordList)
End Sub