1
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”])。此外,可能有更多类型的任意大小的数组列表(例如 ["@","#","$"])。所以真正唯一确定的是始终:

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,但是任何有效的算法我都可以自己转换。如果不清楚,我深表歉意,我很难用语言表达,这可能是我想不出解决方案的部分原因。

4

1 回答 1

1

我知道两种解决方案,递归和非递归。这是非递归的(类似于如何获得二维数组可能组合的答案)

1)将每个数组的长度相乘。这是您可以进行的可能组合的数量。打电话给这个totalcombinations

2) 设置一个 int[] 数组,称为counters. 它应该和数组的数量一样长,并且全部初始化为0。

3a) 对于totalcombinations时间,连接counter[0]th 中的条目,... 中arrays[0]counter[1]第 th 条目arrays[1]等并将其添加到所有结果的列表中。

3b) 然后设置j = 0并递增counters[j]。如果这导致counters[j] > arrays[j].length, 那么counters[j] = 0,++j并增加新的counters[j](例如重复 3b))直到你没有得到这样的溢出。

如果您将其想象counters成手提箱的玻璃杯 - 当您将第一个数字从 9 溢出到 0 时,下一个数字会滴答作响 - 那么您应该在这里获得策略。

于 2013-04-08T04:23:25.473 回答