用于基于包含不同值的不同集生成变体的算法

时间:2013-06-06 15:32:23

标签: algorithm variations

简而言之,我正在寻找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

有人可以帮忙吗? 我相信一个类似的更简单的例子是,如果你想在一些服装店生成不同尺寸,颜色和材料的产品,你想要所有的变化。

1 个答案:

答案 0 :(得分:4)

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);
        }
    }
}