Vb.net所有组合
我有6个项目需要组合 列出的项目:(这是一个示例)Vb.net所有组合,vb.net,combinations,Vb.net,Combinations,我有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