2013-06-06 1 views
1

Короче, я ищу способ в 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

http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx и ссылки сл. – AakashM

+3

Много на SO, когда вы ищете Декартовы продукт; выберите свой любимый обман :) – AakashM

+5

Просто пройдите через каждый набор и добавьте строки? например, «для i в (Макс, Джек, Роджер) для j in (любит, ненавидит) для k in (Java, C#) печатать i + j + k;'? –

ответ

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

EDIT:

О, я вижу. Я не понял этот вопрос. Вы можете использовать магию рекурсии, чтобы решить эту проблему. Это то, что вы хотите:

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

Было немного сложнее, потому что количество циклов для петель не было исправлено. Я имею в виду, что количество «наборов» - это не просто 3, и я не хотел реверсификации ... но в любом случае я не спросил правильно, поэтому спасибо за татуировку – JOKe

+0

@JOKe я обновил ответ, проверьте его – SteveL

+0

Yup Я согласен с рекурсией, вы можете :) Я также нашел этот ответ, который находится на C#, но также показывает хорошее решение, используя C# magic :): http://stackoverflow.com/questions/545703/comb-of-listlistint В любом случае я уже делал это с рекурсией :) – JOKe