我想生成group:item的所有组合,而组合中没有重复的项目。 我更喜欢用Java 8流解决方案。实际上,我有一个针对“ for”的解决方案,但是它占用的内存过多,并且对于大型阵列它会失败。我在第5组第61项中对其进行了测试。
my actual solution based on this answer
如果可以更好地使用2D数组groupItem [group] [item],或者像波纹管一样使用嵌套列表。
这样做的目的是通过组合不同的组来获得最佳价格。
groupItem[][] itemss = {
{
new groupItem().setGroup(1).setItem(1),
new groupItem().setGroup(1).setItem(2),
new groupItem().setGroup(1).setItem(3),
new groupItem().setGroup(1).setItem(4)
},{
new groupItem().setGroup(2).setItem(1),
new groupItem().setGroup(2).setItem(2),
new groupItem().setGroup(2).setItem(3),
new groupItem().setGroup(2).setItem(4)
},{
new groupItem().setGroup(3).setItem(1),
new groupItem().setGroup(3).setItem(2),
new groupItem().setGroup(3).setItem(3),
new groupItem().setGroup(3).setItem(4)
}};
class groupItem {
private int group;
private int item;
private double price;
public int getGroup() {
return group;
}
public groupItem setGroup(int group) {
this.group = group;
return this;
}
public int getItem() {
return item;
}
public groupItem setItem(int item) {
this.item = item;
return this;
}
}
我的实际代码:
private List<List<groupItem>> combine(groupItem[][] matrix) {
long sizeArray[] = new long[matrix.length];
int counterArray[] = new int[matrix.length];
int total = 1;
for (int i = 0; i < matrix.length; ++i) {
sizeArray[i] = matrix[i].length;
if(total * matrix[i].length == 0)
break;
total *= matrix[i].length;
}
List<List<groupItem>> items = new ArrayList<>(total);
for (int count = total; count > 0; --count) {
List<groupItem> sum = new ArrayList<>();
for (int i = 0; i < matrix.length; ++i) {
sum.add(matrix[i][counterArray[i]]);
}
items.add(sum);
for (int incIndex = matrix.length - 1; incIndex >= 0; --incIndex) {
if (counterArray[incIndex] + 1 < sizeArray[incIndex]) {
++counterArray[incIndex];
break;
}
counterArray[incIndex] = 0;
}
}
return items;
}
预期产量
[1:1, 1:2, 1:3, 1:4]
[1:1, 1:2, 1:3, 2:4]
[1:1, 1:2, 1:3, 3:4]
[1:1, 1:2, 1:3, 4:4]
[1:1, 1:2, 2:3, 1:4]
[1:1, 1:2, 2:3, 2:4]
[1:1, 1:2, 2:3, 3:4] ....
编辑:您能帮我加快这段代码的速度,还是将其重写为流,因为对于更大的数组(60 ^ 5),它会失败。
谢谢。