ArrayList<ArrayList<ArrayList<String>>> one = new ArrayList<ArrayList<ArrayList<String>>>();
one
看起来像这样,有一些示例值:
[
[
["A","B","C",...],
["G","E","J",...],
...
],
[
["1","2",...],
["8","5","12","7",...],
...
],
...
]
假设总是有一个基本情况,至少有一个字母数组列表(例如["A","B","C"]),但可能有更多(例如["X","Y","Z"]),可能有任何大小的数字数组列表,可能根本没有,但可能有数百个(例如["1","2","3"],…,["997","998","999"])。此外,可以有更多类型的任意大小的数组列表(例如["@","#","$"])。所以唯一确定的是ALWAYS:
one.size()>=1
one.get(0).size()>=1
one.get(0).get(0).size()>=1
所以问题是:我如何才能最好地获得每个类别的每个组合,而不知道每个数组列表有多大或有任何重复,但假设one。get(0)。get(0)是有效的?例如:["A","B","C",...] ["1","2",...] ...
, ["A","B","C",...] ["8","5","12","7",...] ...
。我目前在我的项目中使用Java,但任何算法的工作,我可以转换自己。如果我说得不清楚,我很抱歉,我很难用语言表达出来,这可能是我想不出解决办法的部分原因。
我知道两个解,递归的和非递归的。这里是非递归的(类似于如何获得二维数组可能组合的答案)
1)将每个数组的长度相乘。这是你可以做出的可能组合的数量。称之为totalcombinations
。
2)创建一个名为counters
的int[]数组。它应该和数组的个数一样长,并且都初始化为0。
3a)对于totalcombinations
次,将arrays[0]
中的counter[0]
次,arrays[1]
中的counter[1]
次…等,并将其添加到所有结果列表中。
3b)则设置j = 0
,并增加counters[j]
。如果这导致counters[j] > arrays[j].length
,那么counters[j] = 0
, ++j
并增加新的counters[j]
(例如重复3b)),直到你没有得到这样的溢出。
如果你把counters
想象成手提箱的玻璃杯——当你从9溢出第一个数字到0时,下一个数字就会越过——那么你应该在这里得到策略。