笛卡尔积的Java实现

 
 

笛卡尔积的概念

 

设A、B为集合。用A中的元素x作为第一元素,B中的元素y作第二元素,构成有序对,所有这样的有序对组成的集合,叫做A
和B的笛卡尔积,记为A×B。 
例如,A={0,1,2},B={a,b}

A×B={<0,a>,<0,b>,<1,a>,<1,b>,<2,a>,<2,b>};

B×A={,,,,,}。

注意:对于有限集合可以进行多次笛卡尔积运算。
 
在本程序中,集合用一个ArrayList数据类型来表示,参数al0为参与笛卡尔积运算的A,B等集合的一个数组链表
public void Dikaerji0(ArrayList al0) { ArrayList a0 = (ArrayList) al0.get(2); for (int i = 3; i < al0.size(); i++) { ArrayList a1 = (ArrayList) al0.get(i); ArrayList temp = new ArrayList(); //每次先计算两个集合的笛卡尔积,然后用其结果再与下一个计算 for (int j = 0; j < a0.size(); j++) { for (int k = 0; k < a1.size(); k++) { ArrayList cut = new ArrayList(); if (a0.get(j) instanceof ArrayList) { cut.addAll((ArrayList) a0.get(j)); } else { cut.add(a0.get(j)); } if (a1.get(k) instanceof ArrayList) { cut.addAll((ArrayList) a1.get(k)); } else { cut.add(a1.get(k)); } temp.add(cut); } } a0 = temp; for (int j = 0; j < a0.size(); j++) { System.out.println(a0.get(j)); } } }
注意:在实现过程中,出现了一个小错误,特列出来分析一下,当临时变量temp定义在第一个for循环之外时,则在计算所有
集合的笛卡尔积的过程中,temp变量始终存在,但是在每次计算完两个集合的笛卡尔积后,a0=temp的赋值运算,则使得
a0指向temp变量,这就导致在计算两个集合的笛卡尔积的两个for循环出现了死循环,即,由于a0和temp指向同一个对
象,当a0循环一次后,temp也发生变化,导致循环不止。由此问题需要注意:1,临时变量temp其生存期仅在仅在计算两个
笛卡尔积的集合时,记录运算结果期间,从计算开始到结束。2,java对象变量和普通变量的区别,即相当于在参数传递时的
地址传送还是值传送

你可能感兴趣的:(笛卡尔积的Java实现)