我试图基于此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(固定类型)的笛卡尔积。但是我发现了一些奇怪的东西。笛卡尔积始终以相反的顺序给出。 ...
发生这种情况是由于递归。索引最初为0,因此在for (ArrayList<Double> set : _cartesianProduct(index + 1, sets)) {
行,您的代码以index = 1再次调用cartesianProduct
。它再次到达该行,并以index = 2调用cartesianProduct
。当它在index = 2时,它达到其基本情况并返回一个带有空ArrayList
的集合。