2016-04-11 9 views
0

私は、一連のデータのすべての組み合わせを返すために遭遇した再帰アルゴリズムの修正版を使用しています。たとえば、データセットが["ABCD"、 "ACDEF"、 "ABDFG"、 "BDEF"、 "CGEGD"]である場合、リスト内で次のようにしたいと思います。指定された長さの別の一意の要素。 BEF、BCF、BCG、BDE、BDF、BDG、BEF、BEF、BEF、BEF、BEF、BEF、 BEG、BFG、CDE、CDF、CDG、CEF、CEG、CFG、DEF、DEG、DFG、EFGJavaの再帰的void関数からの結果を使用し、それぞれをリストに追加して別の関数に返します。

ここでは、これまでの私のクラスである:

import java.util.ArrayList; 
import java.util.LinkedHashSet; 
import java.util.List; 
import java.util.Set; 

class Comboo { 

    public static void combinationAssShit(String arr[], String data[], int start, int end, int index, int r){ 

    if (index == r) 
    { 
     for (int j=0; j<r; j++) 
      System.out.print(data[j]+" "); 

     System.out.println(""); 
     return; 
    } 

    for (int i=start; i<=end && end-i >= r-index; i++) 
    { 
     data[index] = arr[i]; 
     combinationAssShit(arr, data, i+1, end, index+1, r); 
    } 
} 

    public static void printCombination(String arr[], int n, int r) 
    { 
     String data[]=new String[r]; 
     combinationAssShit(arr, data, 0, n, 0, r); 
    } 

    public static String[] singleElem(String[] data) { 
     List<String> single = new ArrayList<String>(); 

     for (String element: data) { 
      for (int x = 0; x < element.length(); x++) { 
       single.add(Character.toString(element.charAt(x))); 
      } 
     } 

     Set<String> singleS = new LinkedHashSet<String>(single); 

     List<String> singleL = new ArrayList<String>(); 

     singleL.addAll(singleS); 

     String[] john = singleL.toArray(new String[singleL.size()]); 
     return john; 
    } 

    public static void main (String[] args) { 
     String arr[] = {"ABCD", "ACDEF", "ABDFG", "BDEF", "CGEGD"}; 
     int r = 3; 

     String[] t = singleElem(arr); 
     int n = t.length; 
     printCombination(t, n, r); 
    } 
} 

ますのでご注意ください。私は、訂正がたくさんあることを知っています。私はJavaの新しいブランドです。私はC++とPythonに慣れています。この問題の場合、コンボジェネレータから結果を返すことで、リスト内のコンビネーションを簡単に収集できます。

+0

void関数の結果はありません。それがvoidの定義です。他の場所で使用するには、実際の値(Stringなど)を返す必要があります。 –

+0

私は理解しています、これはここでの問題です。どのように私は再帰的なループで文字列を返す必要があるかについてのヒントを得た? – Ripha

+0

"私はC++とPythonに慣れています。この問題の場合、コンボジェネレータの結果を返すことでリスト内のコンビネーションを簡単に収集できます。"私はあなたがこれによって何を意味しているのか知りたいのです。あなたはJavaで同じことをすることができるはずです。 – DavidS

答えて

1

最終結果(文字列)を返す場合は、再帰プロシージャのすべてのコードを別のヘルパーメソッドにスローし、初期メソッドでヘルパーを呼び出して結果を返すことができます。 もちろん、リターンで結果を渡すために、再帰ヘルパーとメソッドの両方を無効にする必要もあります。 List<String>

+1

これは、いくつかのコード例でもっと便利になるでしょう。 – DavidS

1

変更メソッドの戻り値の型、およびリストに値を追加します。

public static List<String> combinationAssShit(String arr[], String data[], int start, int end, int index, int r){ 
    List<String> result = new ArrayList<>(); 
    if (index == r) { 
    StringBuilder sb = new StringBuilder(); 
    for (int j=0; j<r; j++) { 
     sb.append(data[j]); 
     sb.append(" "); 
    } 
    result.add(sb.toString()); 
    } else { 
    for (int i=start; i<=end && end-i >= r-index; i++) 
    { 
     data[index] = arr[i]; 
     result.addAll(combinationAssShit(arr, data, i+1, end, index+1, r)); 
    } 
    } 
    return result; 
} 

代わりに、メソッドのパラメータとしてList<String>を追加することができますので、あなたは維持する必要はありません。新しいインスタンスの作成時:

public static void combinationAssShit(
    String arr[], String data[], int start, int end, int index, int r, 
    List<String> result){ 
+0

"...リストにというリストをパラメータとして追加することができます..."再帰的プログラミングでは、これは「アキュムレータ」変数と呼ばれることがあります。 – DavidS

関連する問題