我正在尝试解决Java中的以下问题:
我有一个12个"Person"对象的列表(但为了简化计算,让我们用整数表示它们),我想创建所有可能的唯一组合。我在网上找到了足够多的片段来帮助我(到目前为止我用过这个),但下面是我无法理解的部分:
该列表分为4个子列表,长度可变,其中的顺序无关紧要。这些长度在int数组中定义,例如{3,4,2,3}。
在给定的示例中,原始列表可能如下所示:
{ 1,2,3, 4,5,6,7, 8,9, 10,11,12 }
如果这个是相同的,则不应进行计算:
{ 3,2,1, 7,6,5,4, 9,8, 12,11,10 }
我只想计算一个,因为首先计算每个组合,然后对所有子列表进行排序,然后比较所有列表,这当然是非常不可行的。
附言:我找不到比这个更好的标题了,这就是为什么我也没有成功地在谷歌上搜索到这个问题。建议将不胜感激:-)
我花了一些时间在上面,并使用组合库编写了一些代码https://code.google.com/p/combinatoricslib/#3._Simple_combinations
它打印出你需要的组合。我希望它能有所帮助。
public class Test {
static List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
static int[] groups = new int[] { 3, 4, 2, 3 };
public static void main(String[] args) throws Exception {
print("", 0, list);
}
private static void print(String previousVector, int groupIndex, List<Integer> aList) {
if (groupIndex == groups.length) { // last group
System.out.println(previousVector);
return;
}
ICombinatoricsVector<Integer> vector = Factory.createVector(aList.toArray(new Integer[0]));
Generator<Integer> generator = Factory.createSimpleCombinationGenerator(vector, groups[groupIndex]);
for (ICombinatoricsVector<Integer> combination : generator) {
String vectorString = previousVector + combination.getVector().toString();
List<Integer> copy = new LinkedList<>(aList);
copy.removeAll(combination.getVector());
print(vectorString, groupIndex + 1, copy);
}
}
}