java多個一維陣列進行組合排序 笛卡爾積
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArraySortUtil {
/**
* 獲取N個集合的笛卡爾積
* <p/>
* 說明:假如傳入的字串為:"1,2,3==5,6==7,8"
* 轉換成字串陣列為:[[1, 2, 3], [5, 6], [7, 8]]
* a=[1, 2, 3]
* b=[5, 6]
* c=[7, 8]
* 其大小分別為:a_length=3,b_length=2,c_length=2,
* 目標list的總大小為:totalSize=3*2*2 = 12
* 對每個子集a,b,c,進行迴圈次數=總記錄數/(元素個數*後續集合的笛卡爾積個數)
* 對a中的每個元素迴圈次數=總記錄數/(元素個數*後續集合的笛卡爾積個數)=12/(3*4)=1次,每個元素每次迴圈列印次數:後續集合的笛卡爾積個數=2*2個
* 對b中的每個元素迴圈次數=總記錄數/(元素個數*後續集合的笛卡爾積個數)=12/(2*2)=3次,每個元素每次迴圈列印次數:後續集合的笛卡爾積個數=2個
* 對c中的每個元素迴圈次數=總記錄數/(元素個數*後續集合的笛卡爾積個數)=12/(2*1)=6次,每個元素每次迴圈列印次數:後續集合的笛卡爾積個數=1個
* <p/>
* 執行結果:
* [[1, 2, 3], [5, 6], [7, 8]]
* 1,5,7,
* 1,5,8,
* 1,6,7,
* 1,6,8,
* 2,5,7,
* 2,5,8,
* 2,6,7,
* 2,6,8,
* 3,5,7,
* 3,5,8,
* 3,6,7,
* 3,6,8]
* <p/>
* 從結果中可以看到:
* a中的每個元素每個元素迴圈1次,每次列印4個
* b中的每個元素每個元素迴圈3次,每次列印2個
* c中的每個元素每個元素迴圈6次,每次列印1個
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String source = "保障型別:經濟版,標準版,尊享版,旗艦版|保障期限:1年,30天,90天|保障年齡:1歲,18歲,60歲|測試:c1,c2";
List<String> result = descartes(source);
for(String s : result){
System.out.println(s);
}
System.out.println("總計條數:"+result.size());
}
@SuppressWarnings("rawtypes")
public static List<String> descartes(String source) {
String str = "";
String []sourceArr = source.split("\\|");
for(int i=0;i<sourceArr.length;i++){
if(i == 0){
str += sourceArr[i].split(":")[1];
}else{
str = str +"=="+ sourceArr[i].split(":")[1];
}
}
String[] list = str.split("==");
List<List> strs = new ArrayList<List>();
for (int i = 0; i < list.length; i++) {
strs.add(Arrays.asList(list[i].split(",")));
}
System.out.println(strs);
int total = 1;
for (int i = 0; i < strs.size(); i++) {
total *= strs.get(i).size();
}
String[] mysesult = new String[total];
int now = 1;
//每個元素每次迴圈列印個數
int itemLoopNum = 1;
//每個元素迴圈的總次數
int loopPerItem = 1;
for (int i = 0; i < strs.size(); i++) {
List temp = strs.get(i);
now = now * temp.size();
//目標陣列的索引值
int index = 0;
int currentSize = temp.size();
itemLoopNum = total / now;
loopPerItem = total / (itemLoopNum * currentSize);
int myindex = 0;
for (int j = 0; j < temp.size(); j++) {
//每個元素迴圈的總次數
for (int k = 0; k < loopPerItem; k++) {
if (myindex == temp.size())
myindex = 0;
//每個元素每次迴圈列印個數
for (int m = 0; m < itemLoopNum; m++) {
mysesult[index] = (mysesult[index] == null ? "" : mysesult[index] + ",") + ((String) temp.get(myindex));
index++;
}
myindex++;
}
}
}
return Arrays.asList(mysesult);
}
}
[[經濟版, 標準版, 尊享版, 旗艦版], [1年, 30天, 90天], [1歲, 18歲, 60歲], [c1, c2]]
經濟版,1年,1歲,c1
經濟版,1年,1歲,c2
經濟版,1年,18歲,c1
經濟版,1年,18歲,c2
經濟版,1年,60歲,c1
經濟版,1年,60歲,c2
經濟版,30天,1歲,c1
經濟版,30天,1歲,c2
經濟版,30天,18歲,c1
經濟版,30天,18歲,c2
經濟版,30天,60歲,c1
經濟版,30天,60歲,c2
經濟版,90天,1歲,c1
經濟版,90天,1歲,c2
經濟版,90天,18歲,c1
經濟版,90天,18歲,c2
經濟版,90天,60歲,c1
經濟版,90天,60歲,c2
標準版,1年,1歲,c1
標準版,1年,1歲,c2
標準版,1年,18歲,c1
標準版,1年,18歲,c2
標準版,1年,60歲,c1
標準版,1年,60歲,c2
標準版,30天,1歲,c1
標準版,30天,1歲,c2
標準版,30天,18歲,c1
標準版,30天,18歲,c2
標準版,30天,60歲,c1
標準版,30天,60歲,c2
標準版,90天,1歲,c1
標準版,90天,1歲,c2
標準版,90天,18歲,c1
標準版,90天,18歲,c2
標準版,90天,60歲,c1
標準版,90天,60歲,c2
尊享版,1年,1歲,c1
尊享版,1年,1歲,c2
尊享版,1年,18歲,c1
尊享版,1年,18歲,c2
尊享版,1年,60歲,c1
尊享版,1年,60歲,c2
尊享版,30天,1歲,c1
尊享版,30天,1歲,c2
尊享版,30天,18歲,c1
尊享版,30天,18歲,c2
尊享版,30天,60歲,c1
尊享版,30天,60歲,c2
尊享版,90天,1歲,c1
尊享版,90天,1歲,c2
尊享版,90天,18歲,c1
尊享版,90天,18歲,c2
尊享版,90天,60歲,c1
尊享版,90天,60歲,c2
旗艦版,1年,1歲,c1
旗艦版,1年,1歲,c2
旗艦版,1年,18歲,c1
旗艦版,1年,18歲,c2
旗艦版,1年,60歲,c1
旗艦版,1年,60歲,c2
旗艦版,30天,1歲,c1
旗艦版,30天,1歲,c2
旗艦版,30天,18歲,c1
旗艦版,30天,18歲,c2
旗艦版,30天,60歲,c1
旗艦版,30天,60歲,c2
旗艦版,90天,1歲,c1
旗艦版,90天,1歲,c2
旗艦版,90天,18歲,c1
旗艦版,90天,18歲,c2
旗艦版,90天,60歲,c1
旗艦版,90天,60歲,c2
總計條數:72