基于包含不同值的不同集合生成变化的算法

Posted

技术标签:

【中文标题】基于包含不同值的不同集合生成变化的算法【英文标题】:Algorithm for generating variations based on different sets containing different values 【发布时间】:2013-06-06 15:32:23 【问题描述】:

简而言之,我正在寻找一种在 Java/C# 中基于包含不同值的不同集合生成所有可能变化的方法。 例如: 假设我们有一组名称:

 -Max, Jack, Roger

第二组动词

-Loves, hates, knows

第三套编程语言只是一个例子,但我们可能有 10 套

-Java, C#, Python, Visual Basic, C++

我想要的是一种生成包含所有属性并具有所有值的所有可能变体的方法,例如输出应该是:

Max loves Java
Jack loves Java
Roger loves Java
Max hates Java
Jack hates Java
Roger hates Java
Max knows Java
Jack knows Java
Roger knows Java
Max loves C#
Jack loves C# 
Roger loves C#
and so on... this will generate 45 variations if I am not wrong at the end

谁能帮忙? 我相信一个类似的更简单的例子是,如果您想在某些服装店中生成具有不同尺寸、颜色和材料的产品变体,并且您想要所有变体。

【问题讨论】:

blogs.msdn.com/b/ericlippert/archive/2010/06/28/… 和链接序列。 搜索笛卡尔积时会出现很多情况;选择你最喜欢的骗子:) 简单地遍历每个集合并附加字符串?例如,for i in (Max, Jack, Roger) for j in (loves, hates) for k in (Java, C#) print i+j+k;? 【参考方案1】:
String[] names="Max", "Jack", "Roger";
String[] verbs="Loves", "hates", "knows";
String[] languages="Java", "C#", "Python", "Visual Basic", "C++";
for(String name:names)
   for(String verb:verbs)
      for(String language:languages)
         System.out.println(name+" "+verb+" "+language);

编辑:

哦,我明白了。我误解了这个问题。 您可以使用递归的魔力来解决这个问题。 这就是你想要的:

public static void main(String[] args) 
    String[][] sets=
            "Max", "Jack", "Roger",
            "Loves", "hates", "knows",
            "Java", "C#", "Python", "Visual Basic", "C++",
    ;
    combine(sets,0,"");


public static void combine(String[][] list,int index,String upperText)

    if(index==list.length)return;
    for(String i:list[index])
        combine(list,index+1,upperText+i);
        if(index==list.length-1)
            System.out.println(upperText+i);
        
    

【讨论】:

这有点棘手,因为 for 循环的数量没有固定。我的意思是“集合”的数量不只是 3,我不想引起反响......但无论如何我没有问正确,非常感谢您的帮助 是的,我同意递归,你可以 :) 我还找到了这个答案,它在 C# 中,但使用 C# 魔法也显示了很好的解决方案:):***.com/questions/545703/combination-of-listlistint 无论如何我已经完成了递归:)

以上是关于基于包含不同值的不同集合生成变化的算法的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:获取具有两个值的不同组合的最新文档

根据两个不同对象的变化将文本绑定到转换器[重复]

如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器

集合(Collection解析 Set List Map三大集合运用)

在 Anylogic 中为代理参数分配不同值的正确方法是啥?

SimHash算法