首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vb.net全组合

Vb.net全组合
EN

Stack Overflow用户
提问于 2011-10-21 18:24:54
回答 4查看 2.6K关注 0票数 1

我有6个必须组合的项目,

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

  • 类人猿
  • 奶牛
  • 小鹿小鹿

所以“鹿”有两个子项目。

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

猿牛(鹿,小鹿,大鹿)

因此,您可以看到哪个项目有更多的项目。

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

  • 猿牛鹿羊
  • 猿牛小鹿羊
  • 猿牛大鹿羊

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

有人能帮我吗?

编辑:

有时列表也是这样的:

  • 类人猿
  • 奶牛
  • 小鹿小鹿
  • 鼠标:黑鼠

(因此更多有分项的项目)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-21 21:03:29

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

代码语言:javascript
运行
复制
Function GetCombinations(items As String()(), Optional index As Integer = 0) As List(Of String())
    Dim combinations As New List(Of String())
    Dim lastIndex = items.Count - 1
    Select Case index
        Case Is < 0, Is > lastIndex
            Throw New ArgumentException("index should be 0 or greater")
        Case lastIndex
            For Each item In items(index)
                combinations.Add({item})
            Next
        Case Else
            Dim nextCombinations = GetCombinations(items, index + 1)
            For Each item In items(index)
                For Each nextCombination In nextCombinations
                    combinations.Add({item}.Concat(nextCombination).ToArray)
                Next
            Next
    End Select
    Return combinations
End Function

测试代码:

代码语言:javascript
运行
复制
Dim items = {({"Ape"}), ({"Cow"}), ({"Deer", "Small deer", "Big deer"}), ({"Sheep"}), ({"Mouse", "Black Mouse", "White mouse"})}
For Each combination In GetCombinations(items)
    Console.WriteLine(String.Join(", ", combination))
Next

测试产出:

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2011-10-21 19:20:08

您将需要我的解决方案的一个变体,我在在这个解决方案中中给出了类似的问题。也许这就足够让你和睦相处了?

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

代码语言:javascript
运行
复制
   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等索引,而不是数字本身,并为每个子列表创建类似的操作。

票数 1
EN

Stack Overflow用户

发布于 2011-10-21 19:27:38

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

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

当你有"Ape“时,你需要把它看作{Ape}。这就是你的清单:

{阿佩},{牛},{鹿,小鹿,大鹿},{绵羊}

从这里开始,通过分组外部列表并遍历内部列表来构建组合。

也就是说,第一项{Ape}只有一个元素,所以您只会对该元素进行一次迭代。{Cow}也是这样,但是第三只和所有的鹿都会被迭代3次。

这应该足以让你开始工作了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7853653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档