ArrayList<ArrayList<ArrayList<String>>> one = new ArrayList<ArrayList<ArrayList<String>>>();
one
在一些示例值中如下所示:[
[
["A","B","C",...],
["G","E","J",...],
...
],
[
["1","2",...],
["8","5","12","7",...],
...
],
...
]
假设总是有一个基本大小写,至少有一个字母arraylist(例如,[“A”,“B”,“C”]),但可能有更多的字母arraylist(例如,[“X”,“Y”,“Z”]),并且可能有任意大小的数字arraylist,可能根本没有,但可能有数百个(例如,[“1”,“2”,“3”],…,[“997”,“998”,“999”)。此外,可以有更多类型的任意大小的arraylist(例如,“@”、“”、“$”])。所以唯一确定的是:
one.size()>=1
one.get(0).size()>=1
one.get(0).get(0).size()>=1
所以问题是:如果我不知道每个arraylist有多大,或者有任何重复,但假设一个.get(0).get(0)是有效的,我如何才能最好地得到每个类别的每个组合例如
["A","B","C",...] ["1","2",...] ...
,["A","B","C",...] ["8","5","12","7",...] ...
。我目前正在我的项目中使用java,但是任何一个有效的算法我都可以转换。如果不清楚,我很抱歉,我很难用语言表达出来,这可能是我想不出解决办法的原因之一。 最佳答案
我知道两种解决方案,递归和非递归这里是非递归的(类似于How to get 2D array possible combinations的答案)
1)将每个数组的长度相乘。这是您可以进行的可能组合的数目。称之为totalcombinations
。
2)设置一个名为counters
的int[]数组。它应该和数组的数目一样长,并且都初始化为0。
3a)对于totalcombinations
次,连接counter[0]
中的第arrays[0]
个条目,counter[1]
中的第arrays[1]
个条目等等,并将其添加到所有结果的列表中。
3b)然后设置j = 0
并增加counters[j]
如果这导致counters[j] > arrays[j].length
,则counters[j] = 0
,++j
并增加新的counters[j]
(例如,重复3b),直到没有出现这种溢出。
如果你把counters
想象成一个手提箱的玻璃杯-当你把第一个数字从9溢出到0时,下一个数字会打勾-那么你应该在这里得到策略。