这个答案将打印所有组合,不使用递归的,但如果组合的总数超过Long.MAX_VALUE
将失败。由于打印许多行永远不会结束,这不是一个真正的问题。
要按顺序打印组合,请考虑一个递增数字,其中数字的每个数字都是相应子列表的索引。
实例(使用来自问题列表的列表):
000: blue 1 dog
001: blue 1 cat
002: blue 1 fish
003: blue 1 bird
010: blue 2 dog
...
121: red 3 cat
122: red 3 fish
123: red 3 bird
每个“数字”将翻转,当它到达相应的子列表,例如端最后一个子列表只有4个元素,所以数字从3翻到0.
注意:“数字”可以计数高于9.以十六进制表示这种情况。
现在,数字的数量也是动态的,即外部列表的大小。用简单的循环来做到这一点的一种方法是计算组合的总数(2 * 3 * 4 = 24),然后使用除法和余数来计算数字。
实施例:
Combination #10 (first combination is #0):
10 % 4 = 2 (last digit)
10/4 % 3 = 2 % 3 = 2 (middle digit)
10/4/3 % 2 = 0 % 2 = 0 (first digit)
Digits: 022 = blue 3 fish
为了解决这个问题,我们首先建立除数,例如阵列div[] = { 12, 4, 1 }
,并找到组合的总数(24
)。
long[] div = new long[array.length];
long total = 1;
for (int i = array.length - 1; i >= 0; i--) {
div[i] = total;
if ((total *= array[i].length) <= 0)
throw new IllegalStateException("Overflow or empty sublist");
}
现在我们可以通过组合循环,并打印出结果:
for (long combo = 0; combo < total; combo++) {
for (int i = 0; i < array.length; i++) {
int digit = (int) (combo/div[i] % array[i].length);
if (i != 0)
System.out.print(' ');
System.out.print(array[i][digit]);
}
System.out.println();
}
与问题输入:
String[][] array = {{"blue", "red"}, {"1", "2", "3"}, {"dog","cat", "fish", "bird"}};
我们得到以下的输出:
blue 1 dog
blue 1 cat
blue 1 fish
blue 1 bird
blue 2 dog
blue 2 cat
blue 2 fish
blue 2 bird
blue 3 dog
blue 3 cat
blue 3 fish
blue 3 bird
red 1 dog
red 1 cat
red 1 fish
red 1 bird
red 2 dog
red 2 cat
red 2 fish
red 2 bird
red 3 dog
red 3 cat
red 3 fish
red 3 bird
它可以处理e子阵列的任何组合,例如,与尺寸2,3,2 4子阵列,和2:
String[][] array = {{"small", "large"}, {"black", "tan", "silver"}, {"lazy", "happy"}, {"dog", "cat"}};
small black lazy dog
small black lazy cat
small black happy dog
small black happy cat
small tan lazy dog
small tan lazy cat
small tan happy dog
small tan happy cat
small silver lazy dog
small silver lazy cat
small silver happy dog
small silver happy cat
large black lazy dog
large black lazy cat
large black happy dog
large black happy cat
large tan lazy dog
large tan lazy cat
large tan happy dog
large tan happy cat
large silver lazy dog
large silver lazy cat
large silver happy dog
large silver happy cat
,因为您将为程序的每次运行都有各种各样的行和列号,数组根本不会成为用户友好的对象。使用数组列表会让事情变得更容易。既然你是一个新的程序员,我建议你花费额外的10-30分钟来理解ArrayList,这可以节省你几个小时的时间来处理数组。只是一个建议 –