Java笛卡爾積算法原理與實現(xiàn)方法詳解
本文實例講述了Java笛卡爾積算法原理與實現(xiàn)方法。分享給大家供大家參考,具體如下:
笛卡爾積算法的Java實現(xiàn):
(1)循環(huán)內(nèi),每次只有一列向下移一個單元格,就是CounterIndex指向的那列。
(2)如果該列到尾部了,則這列index重置為0,而CounterIndex則指向前一列,相當(dāng)于進位,把前列的index加一。
(3)最后,由生成的行數(shù)來控制退出循環(huán)。
public class Test { private static String[] aa = { "aa1", "aa2" }; private static String[] bb = { "bb1", "bb2", "bb3" }; private static String[] cc = { "cc1", "cc2", "cc3", "cc4" }; private static String[][] xyz = { aa, bb, cc }; private static int counterIndex = xyz.length - 1; private static int[] counter = { 0, 0, 0 }; public static void main(String[] args) throws Exception { for (int i = 0; i < aa.length * bb.length * cc.length; i++) { System.out.print(aa[counter[0]]); System.out.print("\t"); System.out.print(bb[counter[1]]); System.out.print("\t"); System.out.print(cc[counter[2]]); System.out.println(); handle(); } } public static void handle() { counter[counterIndex]++; if (counter[counterIndex] >= xyz[counterIndex].length) { counter[counterIndex] = 0; counterIndex--; if (counterIndex >= 0) { handle(); } counterIndex = xyz.length - 1; } } }
輸出共2*3*4=24行:
aa1 bb1 cc1 aa1 bb1 cc2 aa1 bb1 cc3 aa1 bb1 cc4 aa1 bb2 cc1 aa1 bb2 cc2 aa1 bb2 cc3 aa1 bb2 cc4 aa1 bb3 cc1 aa1 bb3 cc2 aa1 bb3 cc3 aa1 bb3 cc4 aa2 bb1 cc1 aa2 bb1 cc2 aa2 bb1 cc3 aa2 bb1 cc4 aa2 bb2 cc1 aa2 bb2 cc2 aa2 bb2 cc3 aa2 bb2 cc4 aa2 bb3 cc1 aa2 bb3 cc2 aa2 bb3 cc3 aa2 bb3 cc4
最近碰到了一個笛卡爾積的算法要求,比如傳遞過來的參數(shù)是"1,3,6,7==4,5,8,9==3,4==43,45,8,9==35,4",則返回的是一個list,如[1,4,3,43,35][1,4,3,43,4][1,4,3,45,35]……,該list包含是4*4*2*4*2=256個元素,現(xiàn)在的思路是這樣的:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class DescartesTest { /** * 獲取N個集合的笛卡爾積 * * 說明:假如傳入的字符串為:"1,2,3==5,6==7,8" * 轉(zhuǎn)換成字符串?dāng)?shù)組為:[[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, * 目標(biāo)list的總大小為:totalSize=3*2*2 = 12 * 對每個子集a,b,c,進行循環(huán)次數(shù)=總記錄數(shù)/(元素個數(shù)*后續(xù)集合的笛卡爾積個數(shù)) * 對a中的每個元素循環(huán)次數(shù)=總記錄數(shù)/(元素個數(shù)*后續(xù)集合的笛卡爾積個數(shù))=12/(3*4)=1次,每個元素每次循環(huán)打印次數(shù):后續(xù)集合的笛卡爾積個數(shù)=2*2個 * 對b中的每個元素循環(huán)次數(shù)=總記錄數(shù)/(元素個數(shù)*后續(xù)集合的笛卡爾積個數(shù))=12/(2*2)=3次,每個元素每次循環(huán)打印次數(shù):后續(xù)集合的笛卡爾積個數(shù)=2個 * 對c中的每個元素循環(huán)次數(shù)=總記錄數(shù)/(元素個數(shù)*后續(xù)集合的笛卡爾積個數(shù))=12/(2*1)=6次,每個元素每次循環(huán)打印次數(shù):后續(xù)集合的笛卡爾積個數(shù)=1個 * * 運行結(jié)果: * [[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] 從結(jié)果中可以看到: a中的每個元素每個元素循環(huán)1次,每次打印4個 b中的每個元素每個元素循環(huán)3次,每次打印2個 c中的每個元素每個元素循環(huán)6次,每次打印1個 * * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str ="1,3,6,7==4,5,8,9==3,4==43,45,8,9==35,4"; List<String> result = descartes(str); System.out.println(result); } @SuppressWarnings("rawtypes") public static List<String> descartes(String str) { 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; //每個元素每次循環(huán)打印個數(shù) int itemLoopNum = 1; //每個元素循環(huán)的總次數(shù) int loopPerItem =1; for(int i=0;i<strs.size();i++){ List temp = strs.get(i); now = now*temp.size(); //目標(biāo)數(shù)組的索引值 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++){ //每個元素循環(huán)的總次數(shù) for(int k=0;k<loopPerItem;k++){ if(myindex==temp.size()) myindex=0; //每個元素每次循環(huán)打印個數(shù) for(int m=0;m<itemLoopNum;m++){ mysesult[index]=(mysesult[index]==null?"":mysesult[index]+",")+((String)temp.get(myindex)); index++; } myindex++; } } } return Arrays.asList(mysesult); } }
運行結(jié)果輸出:
[[1, 3, 6, 7], [4, 5, 8, 9], [3, 4], [43, 45, 8, 9], [35, 4]]
[1,4,3,43,35, 1,4,3,43,4, 1,4,3,45,35, 1,4,3,45,4, 1,4,3,8,35, 1,4,3,8,4, 1,4,3,9,35, 1,4,3,9,4, 1,4,4,43,35, 1,4,4,43,4, 1,4,4,45,35, 1,4,4,45,4, 1,4,4,8,35, 1,4,4,8,4, 1,4,4,9,35, 1,4,4,9,4, 1,5,3,43,35, 1,5,3,43,4, 1,5,3,45,35, 1,5,3,45,4, 1,5,3,8,35, 1,5,3,8,4, 1,5,3,9,35, 1,5,3,9,4, 1,5,4,43,35, 1,5,4,43,4, 1,5,4,45,35, 1,5,4,45,4, 1,5,4,8,35, 1,5,4,8,4, 1,5,4,9,35, 1,5,4,9,4, 1,8,3,43,35, 1,8,3,43,4, 1,8,3,45,35, 1,8,3,45,4, 1,8,3,8,35, 1,8,3,8,4, 1,8,3,9,35, 1,8,3,9,4, 1,8,4,43,35, 1,8,4,43,4, 1,8,4,45,35, 1,8,4,45,4, 1,8,4,8,35, 1,8,4,8,4, 1,8,4,9,35, 1,8,4,9,4, 1,9,3,43,35, 1,9,3,43,4, 1,9,3,45,35, 1,9,3,45,4, 1,9,3,8,35, 1,9,3,8,4, 1,9,3,9,35, 1,9,3,9,4, 1,9,4,43,35, 1,9,4,43,4, 1,9,4,45,35, 1,9,4,45,4, 1,9,4,8,35, 1,9,4,8,4, 1,9,4,9,35, 1,9,4,9,4, 3,4,3,43,35, 3,4,3,43,4, 3,4,3,45,35, 3,4,3,45,4, 3,4,3,8,35, 3,4,3,8,4, 3,4,3,9,35, 3,4,3,9,4, 3,4,4,43,35, 3,4,4,43,4, 3,4,4,45,35, 3,4,4,45,4, 3,4,4,8,35, 3,4,4,8,4, 3,4,4,9,35, 3,4,4,9,4, 3,5,3,43,35, 3,5,3,43,4, 3,5,3,45,35, 3,5,3,45,4, 3,5,3,8,35, 3,5,3,8,4, 3,5,3,9,35, 3,5,3,9,4, 3,5,4,43,35, 3,5,4,43,4, 3,5,4,45,35, 3,5,4,45,4, 3,5,4,8,35, 3,5,4,8,4, 3,5,4,9,35, 3,5,4,9,4, 3,8,3,43,35, 3,8,3,43,4, 3,8,3,45,35, 3,8,3,45,4, 3,8,3,8,35, 3,8,3,8,4, 3,8,3,9,35, 3,8,3,9,4, 3,8,4,43,35, 3,8,4,43,4, 3,8,4,45,35, 3,8,4,45,4, 3,8,4,8,35, 3,8,4,8,4, 3,8,4,9,35, 3,8,4,9,4, 3,9,3,43,35, 3,9,3,43,4, 3,9,3,45,35, 3,9,3,45,4, 3,9,3,8,35, 3,9,3,8,4, 3,9,3,9,35, 3,9,3,9,4, 3,9,4,43,35, 3,9,4,43,4, 3,9,4,45,35, 3,9,4,45,4, 3,9,4,8,35, 3,9,4,8,4, 3,9,4,9,35, 3,9,4,9,4, 6,4,3,43,35, 6,4,3,43,4, 6,4,3,45,35, 6,4,3,45,4, 6,4,3,8,35, 6,4,3,8,4, 6,4,3,9,35, 6,4,3,9,4, 6,4,4,43,35, 6,4,4,43,4, 6,4,4,45,35, 6,4,4,45,4, 6,4,4,8,35, 6,4,4,8,4, 6,4,4,9,35, 6,4,4,9,4, 6,5,3,43,35, 6,5,3,43,4, 6,5,3,45,35, 6,5,3,45,4, 6,5,3,8,35, 6,5,3,8,4, 6,5,3,9,35, 6,5,3,9,4, 6,5,4,43,35, 6,5,4,43,4, 6,5,4,45,35, 6,5,4,45,4, 6,5,4,8,35, 6,5,4,8,4, 6,5,4,9,35, 6,5,4,9,4, 6,8,3,43,35, 6,8,3,43,4, 6,8,3,45,35, 6,8,3,45,4, 6,8,3,8,35, 6,8,3,8,4, 6,8,3,9,35, 6,8,3,9,4, 6,8,4,43,35, 6,8,4,43,4, 6,8,4,45,35, 6,8,4,45,4, 6,8,4,8,35, 6,8,4,8,4, 6,8,4,9,35, 6,8,4,9,4, 6,9,3,43,35, 6,9,3,43,4, 6,9,3,45,35, 6,9,3,45,4, 6,9,3,8,35, 6,9,3,8,4, 6,9,3,9,35, 6,9,3,9,4, 6,9,4,43,35, 6,9,4,43,4, 6,9,4,45,35, 6,9,4,45,4, 6,9,4,8,35, 6,9,4,8,4, 6,9,4,9,35, 6,9,4,9,4, 7,4,3,43,35, 7,4,3,43,4, 7,4,3,45,35, 7,4,3,45,4, 7,4,3,8,35, 7,4,3,8,4, 7,4,3,9,35, 7,4,3,9,4, 7,4,4,43,35, 7,4,4,43,4, 7,4,4,45,35, 7,4,4,45,4, 7,4,4,8,35, 7,4,4,8,4, 7,4,4,9,35, 7,4,4,9,4, 7,5,3,43,35, 7,5,3,43,4, 7,5,3,45,35, 7,5,3,45,4, 7,5,3,8,35, 7,5,3,8,4, 7,5,3,9,35, 7,5,3,9,4, 7,5,4,43,35, 7,5,4,43,4, 7,5,4,45,35, 7,5,4,45,4, 7,5,4,8,35, 7,5,4,8,4, 7,5,4,9,35, 7,5,4,9,4, 7,8,3,43,35, 7,8,3,43,4, 7,8,3,45,35, 7,8,3,45,4, 7,8,3,8,35, 7,8,3,8,4, 7,8,3,9,35, 7,8,3,9,4, 7,8,4,43,35, 7,8,4,43,4, 7,8,4,45,35, 7,8,4,45,4, 7,8,4,8,35, 7,8,4,8,4, 7,8,4,9,35, 7,8,4,9,4, 7,9,3,43,35, 7,9,3,43,4, 7,9,3,45,35, 7,9,3,45,4, 7,9,3,8,35, 7,9,3,8,4, 7,9,3,9,35, 7,9,3,9,4, 7,9,4,43,35, 7,9,4,43,4, 7,9,4,45,35, 7,9,4,45,4, 7,9,4,8,35, 7,9,4,8,4, 7,9,4,9,35, 7,9,4,9,4]
遞歸算法:
public static void fn(List<String[]> list,String[] arr,String str){ //迭代list List<String> li = new ArrayList<String>(); for(int i=0;i<list.size();i++){ //取得當(dāng)前的數(shù)組 if(i==list.indexOf(arr)){ //迭代數(shù)組 System.out.println(arr.length); for(String st : arr){ st = str + st; if(i<list.size()-1){ fn(list,list.get(i+1),st); }else if(i==list.size()-1){ li.add(st); } } } } for(int i = 0 ; i < li.size();i++ ) { System.out.println(li.get(i)); } }
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
SpringBoot使用Sa-Token實現(xiàn)權(quán)限認(rèn)證
本文主要介紹了SpringBoot使用Sa-Token實現(xiàn)權(quán)限認(rèn)證,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java數(shù)據(jù)結(jié)構(gòu)之雙向鏈表的實現(xiàn)
相較單鏈表,雙向鏈表除了data與next域,還多了一個pre域用于表示每個節(jié)點的前一個元素。這樣做給雙向鏈表帶來了很多優(yōu)勢。本文主要介紹了雙向鏈表的實現(xiàn),需要的可以參考一下2022-10-10解決Beanutils.copyproperties實體類對象不一致的問題
這篇文章主要介紹了解決Beanutils.copyproperties實體類對象不一致的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java中關(guān)于控制臺讀取數(shù)字或字符串的方法
下面小編就為大家?guī)硪黄狫ava中關(guān)于控制臺讀取數(shù)字或字符串的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10關(guān)于swagger配置及踩坑@Api參數(shù)postion無效解決接口排序問題
這篇文章主要介紹了關(guān)于swagger配置及踩坑@Api參數(shù)postion無效解決接口排序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06使用Java獲取系統(tǒng)信息的常用代碼整理總結(jié)
這篇文章主要介紹了使用Java獲取系統(tǒng)信息的常用代碼整理總結(jié),在服務(wù)器端一般經(jīng)常能夠用到,歡迎收藏,需要的朋友可以參考下2015-11-11RestTemplate報錯I/O?error?on?POST?request?for的解決辦法
這篇文章主要給大家介紹了關(guān)于RestTemplate報錯I/O?error?on?POST?request?for的解決辦法,文中通過代碼實例將解決的辦法介紹的非常詳細,需要的朋友可以參考下2023-08-08