2012-02-25 1 views
3

Я хочу создать Java-метод, который принимает inputArray = Object[n][], где n может быть любым целым числом и выводит список возможных комбинаций n-размера между всеми значениями n подмассивов. Ниже приведен пример:Сопоставления значений n подмассивов в Java

входного массив: (где объект = строка и п = 3)

String[] subarrayA = {"A0","A1","A2"}; 
String[] subarrayB = {"B0","B1"}; 
String[] subarrayC = {"C0","C1","C2","C3"}; 
String[3][] inputArray = {subarrayA, subarrayB, subarrayC}; 

Желаемого выход:

{A0,B0,C0},{A0,B0,C1},{A0,B0,C2},{A0,B0,C3}, 
{A0,B1,C0},{A0,B1,C1},{A0,B1,C2},{A0,B1,C3}, 
{A1,B0,C0},{A1,B0,C1},{A0,B0,C2},{A1,B0,C3}, 
{A1,B1,C0},{A1,B1,C1},{A1,B1,C2},{A1,B1,C3}, 
{A2,B0,C0},{A2,B0,C1},{A2,B0,C2},{A2,B0,C3}, 
{A2,B1,C0},{A2,B1,C1},{A2,B1,C2},{A2,B1,C3} 

Очевидно, что я не могу иметь фиксированные вложенные циклы внутри мой метод, так как я не знаю n заранее. Итак, я предполагаю, что единственный способ решить это будет через рекурсивный метод? Любые рекомендации?

P.S: Я знаю простой combination-related posts на веб-сайте.

+0

Это домашнее задание? Что вы пробовали? – Scorpion

+1

Нет, это не домашнее задание. Я пытаюсь создать предыдущую таблицу вероятности для моей байесовской сети на основе набора данных, который имеет только «категориальные» столбцы. Мне нужны комбинации для создания SQL-запросов с заданными значениями столбцов на лету. – Rhubarb

+0

В правильных математических терминах желаемый результат является * декартовым произведением * n наборов ввода. («n-размерные комбинации между всеми значениями n подмассивов», вероятно, также включают в себя {A0, A1, B0}.) – meriton

ответ

6

Это должно решить вашу проблему.

public static void permute(String array[][], int index, ArrayList<String> output){ 

    if(index == array.length){ 
     System.out.println(output.toString()); 
    } 
    else{ 
     for(int i=0 ; i<array[index].length ; i++){ 
      output.add(array[index][i]); 
      permute(array,index+1,output); 
      output.remove(output.size() - 1); 
     } 
    } 
} 
+0

Большое спасибо за вашу помощь. Я не программист, тренируясь и нахожу рекурсию совершенно неинтуитивной, т. Е. Трудно. – Rhubarb

+0

Эта сложность зависит от r в nCr? – LZH

+0

@JProgrammer Можете ли вы объяснить, как это работает. Я не понимаю, как 'output.remove (output.size() - 1);' когда-либо выполняется, если это после вызова 'permute (array, index + 1, output);'. Не называть 'permute()' cause 'output.remove()' никогда не вызываться? – enrique2334