- ベストアンサー
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 以下省略
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
アドバイスというか、ソースを書いてしまいました。効率は無視しています。 再帰を考えるとわかりやすく書けるかも知れませんよ。 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); } } } }
その他の回答 (1)
- HarukaV49
- ベストアンサー率53% (48/89)
入れ個数を可変するようにはなっていませんが、 任意個数の文字列配列の順列を書き下すという 仕様は満たしていると思います。 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 ); }
お礼
ありがとうございました。大変勉強になりました。