最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java笛卡爾積算法原理與實現(xiàn)方法詳解

 更新時間:2017年12月01日 14:58:45   作者:coconut_zhang  
這篇文章主要介紹了Java笛卡爾積算法原理與實現(xiàn)方法,結(jié)合實例形式較為詳細(xì)的分析了笛卡爾積算法的原理及java定義與使用笛卡爾積算法的相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了Java笛卡爾積算法原理與實現(xiàn)方法。分享給大家供大家參考,具體如下:

笛卡爾積算法的Java實現(xiàn):

(1)循環(huán)內(nèi),每次只有一列向下移一個單元格,就是CounterIndex指向的那列。
(2)如果該列到尾部了,則這列index重置為0,而CounterIndex則指向前一列,相當(dāng)于進(jìn)位,把前列的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,進(jìn)行循環(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個
  *
  *  運(yùn)行結(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);
 }
}

運(yùn)行結(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)文章

  • Spring Boot 將yyyy-MM-dd格式的文本字符串直接轉(zhuǎn)換為LocalDateTime出現(xiàn)的問題

    Spring Boot 將yyyy-MM-dd格式的文本字符串直接轉(zhuǎn)換為LocalDateTime出現(xiàn)的問題

    這篇文章主要介紹了Spring Boot 將yyyy-MM-dd格式的文本字符串直接轉(zhuǎn)換為LocalDateTime出現(xiàn)的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • spring事務(wù)的REQUIRES_NEW源碼示例解析

    spring事務(wù)的REQUIRES_NEW源碼示例解析

    這篇文章主要為大家介紹了spring事務(wù)的REQUIRES_NEW源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 深入解析Java中反射中的invoke()方法

    深入解析Java中反射中的invoke()方法

    最近復(fù)習(xí)了一下Java反射的使用,正好了解一下Java中反射中的invoke()方法,稍微整理精簡一下做下分享,感興趣的可以了解一下
    2021-06-06
  • 如何使用eclipse搭建maven多module項目(構(gòu)建父子項目)

    如何使用eclipse搭建maven多module項目(構(gòu)建父子項目)

    這篇文章主要介紹了如何使用eclipse搭建maven多module項目(構(gòu)建父子項目) ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 關(guān)于Java下奇怪的Base64詳解

    關(guān)于Java下奇怪的Base64詳解

    這篇文章主要給大家介紹了關(guān)于Java下奇怪的Base64的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java NIO服務(wù)器端開發(fā)詳解

    Java NIO服務(wù)器端開發(fā)詳解

    這篇文章主要介紹了Java NIO服務(wù)器端開發(fā)詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Java TCP協(xié)議通信超詳細(xì)講解

    Java TCP協(xié)議通信超詳細(xì)講解

    TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission Control Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層
    2022-09-09
  • SpringBoot 指標(biāo)監(jiān)控actuator的專題

    SpringBoot 指標(biāo)監(jiān)控actuator的專題

    未來每一個微服務(wù)在云上部署以后,我們都需要對其進(jìn)行監(jiān)控、追蹤、審計、控制等。SpringBoot就抽取了Actuator場景,使得我們每個微服務(wù)快速引用即可獲得生產(chǎn)級別的應(yīng)用監(jiān)控、審計等功能,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下
    2021-11-11
  • Java?RabbitMQ的持久化和發(fā)布確認(rèn)詳解

    Java?RabbitMQ的持久化和發(fā)布確認(rèn)詳解

    這篇文章主要為大家詳細(xì)介紹了RabbitMQ的持久化和發(fā)布確認(rèn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java實現(xiàn)雙保險線程的示例代碼

    Java實現(xiàn)雙保險線程的示例代碼

    這篇文章主要介紹了Java實現(xiàn)雙保險線程的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論

惠东县| 虎林市| 岗巴县| 衡山县| 革吉县| 敦煌市| 磴口县| 封开县| 简阳市| 吴堡县| 民丰县| 集贤县| 宿松县| 鄢陵县| 新安县| 岑溪市| 正安县| 广汉市| 福贡县| 镇坪县| 江门市| 安义县| 南昌县| 安国市| 惠来县| 桃源县| 淅川县| 黄浦区| 灵石县| 施秉县| 新昌县| 望都县| 宜城市| 曲周县| 芒康县| 大庆市| 五华县| 玛沁县| 恩施市| 贵阳市| 旌德县|