• ベストアンサー

x重入れ子の実装方法について

■やりたいこと: arrayA, arrayB, arrayCの配列から毎回それぞれ1つずつ取り出し、すべてのパタンをプリントする。 ■入れ子の階層が既知の場合: for文を入れ子にしていけばいいのですが(下記サンプルのように) ■入れ子の階層が未知な場合: どのように実装すればよいか、わかりません。 どなたかアドバイスいただけますか? ----------------------------- String[] arrayA = {"a1", "a2", "a3"}; String[] arrayB = {"b1", "b2"}; String[] arrayC = {"c1", "c2", "c3", "c4"}; int count = 1; for (int a = 0; a < arrayA.length; a++) { for (int b = 0; b < arrayB.length; b++) { for (int c = 0; c < arrayC.length; c++) { System.out.println(count + " : " + arrayA[a] + "-" + arrayB[b] + "-" + arrayC[c]); count += 1; } } } ------------------------ 上記ソースの出力: 1 : a1-b1-c1 2 : a1-b1-c2 3 : a1-b1-c3 以下省略

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

アドバイスというか、ソースを書いてしまいました。効率は無視しています。 再帰を考えるとわかりやすく書けるかも知れませんよ。 import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Combination{ public static void main(String[] args) { String[] arrayA = {"a1", "a2", "a3"}; String[] arrayB = {"b1", "b2"}; String[] arrayC = {"c1", "c2", "c3", "c4"}; List<List<String>> arrays = new ArrayList<List<String>>(); arrays.add(Arrays.asList(arrayA)); arrays.add(Arrays.asList(arrayB)); arrays.add(Arrays.asList(arrayC)); List<List<String>> result = new ArrayList<List<String>>(); combination(arrays, new ArrayList<String>(), result); for(int i = 0; i < result.size(); i++){ List<String> ls = result.get(i); System.out.print((i + 1) + ":"); for(int k = 0; k < ls.size(); k++){ System.out.print(ls.get(k) + (k < ls.size() - 1 ? "-" : "")); } System.out.println(); } } public static <T> void combination(List<List<T>> sources, List<T> choosed, List<List<T>> result){ if(sources.size() == 0){ result.add(choosed); }else{ for(int i = 0; i < sources.get(0).size(); i++){ List<T> newChoosed = new ArrayList<T>(choosed); newChoosed.add(sources.get(0).get(i)); combination(sources.subList(1, sources.size()), newChoosed, result); } } } }

hasekyou
質問者

お礼

ありがとうございました。大変勉強になりました。

その他の回答 (1)

  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.2

入れ個数を可変するようにはなっていませんが、 任意個数の文字列配列の順列を書き下すという 仕様は満たしていると思います。  public static void main(String[] args) {   String[] arrayA = {"a1", "a2", "a3"};   String[] arrayB = {"b1", "b2"};   String[] arrayC = {"c1", "c2", "c3", "c4"};      for(int i=0; i<getPermutationCount(arrayA, arrayB, arrayC); i++) {    System.out.printf( "%d %s\n", i, getPermutation(i, arrayA, arrayB, arrayC) );   }  }  /**   * index番目の順列を返します。   * @param index 順列順位   * @param args 順列を求めたい任意個数の任意長文字列配列   * @return 順列文字列   */  private static String getPermutation( int index, String[]... args ) {   String s = "";   for(int i=0, n=args.length; i<n; i++) {    s += (i==0 ? "" : "-") + choose( index, i, args );   }   return s;  }  /**   * index番目の順列の文字列配列digit番の要素を抽出します   * @param index 順列順位   * @param digit 文字列配列の順位   * @param args 順列を求めたい任意個数の文字列配列   * @return 1個の順列文字列   */  private static String choose( int index, int digit, String[]... args ) {   String s = args[digit][ index / getPermutationCount(digit+1, args ) % args[digit].length ];   return s;  }  /**   * digit番目までの順列個数   * @param digit 文字列配列の順位   * @param args 任意個数の文字列配列   * @return 順列個数   */  private static int getPermutationCount( int digit, String[]... args ) {   int count = 1;   for(int i=digit, n=args.length; i<n; i++) {    count *= args[i].length;   }   return count;  }  /**   * 順列総数を求めます   * @param args 任意個数の文字列配列   * @return 順列数   */  private static int getPermutationCount( String[]... args ) {   return getPermutationCount( 0, args );  }

関連するQ&A