Java嵌套列表按流组合,没有重复

时间:2018-08-16 10:50:25

标签: java multidimensional-array combinations

我想生成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),它会失败。

谢谢。

0 个答案:

没有答案