Java中ArrayList的笛卡尔积。颠倒了。但是为什么呢?

问题描述 投票:1回答:1

我试图基于此answer生成未知数量的ArrayList(固定类型)的笛卡尔积。但是我发现了一些奇怪的东西。笛卡尔积始终以reverse顺序给出。例如,如果A和B是两个列表,则在笛卡尔对中,首先给出B的元素,然后给出第二A的元素。可能是什么原因?如何解决?原始答复者说,在笛卡尔积中订购无关紧要。但是我认为在制作笛卡尔积时,订购是最主要的事情,尤其是当每组代表平面坐标时。

修改后的代码:

private static Set<ArrayList<Double>> cartesianProduct(ArrayList<ArrayList<Double>> sets) {
        if (sets.size() < 2)
            throw new IllegalArgumentException(
                    "Can't have a product of fewer than two sets (got " +
                            sets.size() + ")");

        return _cartesianProduct(0, sets);
    }

    private static Set<ArrayList<Double>> _cartesianProduct(int index, ArrayList<ArrayList<Double>> sets) {
        Set<ArrayList<Double>> ret = new HashSet<>();
        if (index == sets.size()) {
            ret.add(new ArrayList<>());
        } else {
            for (Double obj : sets.get(index)) {
                for (ArrayList<Double> set : _cartesianProduct(index + 1, sets)) {
                    set.add(obj);
                    ret.add(set);
                }
            }
        }
        return ret;
    }

输出:

ArrayList<Double> l1 = new ArrayList<>(Arrays.asList(1.0, 2.0));
ArrayList<Double> l2 = new ArrayList<>(Arrays.asList(4.0, 5.0));
ArrayList<ArrayList<Double>> l = new ArrayList<>(Arrays.asList(l1, l2));
Set<ArrayList<Double>> a = cartesianProduct(l);

// a = [[4.0, 1.0], [4.0, 2.0], [5.0, 1.0], [5.0, 2.0]]

我尝试根据此答案生成未知数量的ArrayList(固定类型)的笛卡尔积。但是我发现了一些奇怪的东西。笛卡尔积始终以相反的顺序给出。 ...

java arraylist cartesian-product cartesian-coordinates
1个回答
0
投票

发生这种情况是由于递归。索引最初为0,因此在for (ArrayList<Double> set : _cartesianProduct(index + 1, sets)) {行,您的代码以index = 1再次调用cartesianProduct。它再次到达该行,并以index = 2调用cartesianProduct。当它在index = 2时,它达到其基本情况并返回一个带有空ArrayList的集合。

© www.soinside.com 2019 - 2024. All rights reserved.