2012-02-25 1 views
3

Je souhaite créer une méthode Java qui accepte un inputArray = Object[n][], où n peut être un nombre entier et qui génère une liste de combinaisons possibles de taille n entre toutes les valeurs des n sous-matrices. Voici un exemple:Combinaisons de valeur de n sous-matrices en Java

matrice d'entrée: (où Object = chaîne et n = 3)

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

sortie désiré:

{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} 

Évidemment, je ne peux pas avoir une boucle imbriquée fixée à l'intérieur ma méthode puisque je ne connais pas n à l'avance. Donc, je suppose que la seule façon de le résoudre serait d'utiliser une méthode récursive? Des recommandations?

P.S: Je suis au courant de la simple combination-related posts sur le site Web.

+0

Est-ce un devoir? Qu'avez-vous essayé? – Scorpion

+1

Non, ce n'est pas un devoir. J'essaye de créer une table de probabilité a priori pour mon réseau bayésien, basée sur un ensemble de données qui n'a que des colonnes 'catégoriques'. J'ai besoin des combinaisons pour créer des requêtes SQL avec les valeurs de colonne données à la volée. – Rhubarb

+0

En termes mathématiques, la sortie désirée est le * produit cartésien * des n ensembles d'entrée. ("combinaisons de taille n entre toutes les valeurs des n sous-réseaux" inclurait probablement aussi {A0, A1, B0}.) – meriton

Répondre

6

Cela devrait résoudre votre problème.

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

Merci beaucoup pour votre aide. Je ne suis pas un programmeur de formation et je trouve la récursivité plutôt inintéressante, c'est-à-dire difficile. – Rhubarb

+0

est-ce que cette complexité dépend du r dans nCr? – LZH

+0

@JProgrammer Pouvez-vous expliquer comment cela fonctionne. Je ne comprends pas comment 'output.remove (output.size() - 1);' est jamais exécuté s'il est après que vous appelez 'permute (array, index + 1, output);'. N'appellerait pas 'permute()' cause 'output.remove()' pour ne jamais être appelé? – enrique2334

Questions connexes