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时,下一个数字会打勾-那么你应该在这里得到策略。

09-26 11:07