이 기사는 재귀 및 루프를 기반으로 알려지지 않은 차원의 컬렉션을 구현하는 Java의 직교 제품에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
직교 제품이란 무엇입니까?
수학에서, 직접 제품으로도 알려진 두 세트 x와 y의 데카르트 제품은 x × y로 표현되며, 첫 번째 물체는 X의 구성원이고 두 번째 객체는 가능한 모든 순서 쌍 중 하나입니다.
A = {a, b}를 설정하고 b = {0,1,2}를 설정한다고 가정하면, 두 세트의 데카르트 제품은 {(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}입니다.
Cartesian 제품을 구현하기 위해 프로그램 알고리즘을 사용하는 방법은 무엇입니까?
프로그래밍 전에 세트 수가 알려진 경우, 직교 제품은 프로그램의 여러 루프를 통해 얻을 수 있습니다. 그러나 프로그래밍 전에 세트 수를 모른다면 어떻게 직교 제품을 얻을 수 있습니까? 예를 들어, 컬렉션은 List < List<String>> list 나타냅니다. 프로그래밍 전 목록 수는 알 수 없습니다. 다음 코드는 두 가지 재귀 및 루프 방법을 사용하여 알려지지 않은 차원 세트의 직교 제품을 구현합니다.
import java.util.arraylist; import java.util.arrays; import java.util.list;/*** 2015-05-22에서 생성 된 미지의 차원 세트* @author luweijie*/public classe*/publal incursivallue에서 재귀 적 생산물을 구현하고, 결과적으로 결과적으로 구현합니다. dimvalue raw data* @param 결과 데이터* @param 계층 dimvalue 레이어 수* @param curlist 각 직교 제품의 결과*/ private static void recursive (list <list <string>> dimvalue, list <list <string>> result, int layer, list <string> curlist) {if (layer <dimvalue.size () - 1). (dimvalue.get (layer) .size () == 0) {recursive (dimvalue, result, layer + 1, curlist); } else {for (int i = 0; i <dimvalue.get (layer) .size (); i ++) {list <string> list = new arraylist <string> (curlist); list.add (dimvalue.get (layer) .get (i)); 재귀 (dimvalue, result, layer + 1, list); }}} else if (layer == dimvalue.size () -1) {if (dimvalue.get (layer) .size () == 0) {result.add (curlist); } else {for (int i = 0; i <dimvalue.get (layer) .size (); i ++) {list <string> list = new arraylist <string> (curlist); list.add (dimvalue.get (layer) .get (i)); result.add (list); }}}}} / *** DIMVALUE에서 직교 제품을 구현하려는 루프 결과 결과는 결과에 배치됩니다* @param dimvalue raw data* @param 결과 데이터* / private static void circuit (list <list <string>> dimvalue, list <list <string>> result) {int total = 1; for (list <string> list : dimvalue) {total *= list.size (); } string [] myresult = new String [Total]; int itemloopnum = 1; int loopperitem = 1; int now = 1; for (list <string> list : dimvalue) {now *= list.size (); int index = 0; int currentsize = list.size (); ItemLoopNum = Total / Now; loopperitem = total / (itemloopnum * currentsize); int myIndex = 0; for (String String : list) {for (int i = 0; i <loopperitem; i ++) {if (myIndex == list.size ()) {myIndex = 0; } for (int J = 0; 색인 ++; } myIndex ++; }}} list <string> stringResult = arrays.aslist (myresult); for (string : StringResult) {String [] stringArray = String.split ( ","); result.add (arrays.aslist (StringArray)); }} / *** 프로그램 항목* @param args* / public static void main (String [] args) {list <string> list1 = new ArrayList <string> (); List1.add ( "1"); List1.add ( "2"); list <string> list2 = new ArrayList <string> (); list2.add ( "a"); list2.add ( "b"); list <string> list3 = new ArrayList <string> (); list3.add ( "3"); list3.add ( "4"); list3.add ( "5"); List <string> list4 = new ArrayList <string> (); list4.add ( "c"); list4.add ( "d"); list4.add ( "e"); List <list <string>> dimvalue = new arraylist <list <string>> (); dimvalue.add (list1); dimvalue.add (list2); dimvalue.add (list3); dimvalue.add (list4); List <list <string>> recursiveresult = new ArrayList <list <string>> (); // Cartesian Product Recursive (Dimvalue, Recursiveresult, 0, New ArrayList <String> ())를 재귀 적으로 구현합니다. System.out.println ( "직교 제품을 재귀 적으로 구현합니다. Total" + recursiveresult.size () + "results"); for (list <string> list : recursiveresult) {for (string : list) {system.out.print (String + ""); } system.out.println (); } list <list <string >> CircuitResult = new ArrayList <list <string>> (); 회로 (Dimvalue, CircuitResult); System.out.println ( "루프는 데카르트 제품 : Total" + CircuitResult.size () + "result"); for (list <string> list : circuitResult) {for (string : list) {system.out.print (String + ""); } system.out.println (); }}}출력 결과는 다음과 같습니다.
카르테시아 제품을 재귀 적으로 구현 : 총 36 개의 결과 1 a 3 c1 a 3 d1 a 3 e1 a 4 c1 a 4 d1 a 4 e1 a 5 c1 a 5 d1 a 5 e1 b 3 c1 b 3 d1 b 3 e1 b 4 c1 b 4 d1 b 4 e1 b 5 c1 b 5 d1 b 5 e2 a 3 c2 a 3 d2 a 3 a 4 d2 a 4 a 4 a 4 a 4 a 4 a 4 a 4 a 4 a 4 a 4 a 4 a 4 4 5 D2 A 5 E2 B 3 C2 B 3 D2 B 3 E2 B 4 C2 B 4 D2 B 4 E2 B 5 C2 B 5 D2 B 5 E LOOP 직교 제품을 구현합니다. A 3 C1 A 3 D1 A 3 E1 A 4 C1 A 4 D1 A 4 E1 A 5 C1 A 5 D1 A 5 E1 B 3 C1 B 3 D1 B 3 E1 B 4 D1 B 4 D1 B 4 D1 B 4 B 5 C1 B 5 D1 B 5 E2 A 3 C2 A 3 D2 A 3 E2 A 4 C2 A 4 D2 A 4 E2 A 5 C2 A 5 D2 A 5 E2 B 3 C2 B 3 D2 B 3 E2 B 4 C2 B 4 D2 B 4 E2 B 5 C2 B 5 D2 B 5 E2 B 5 C2 B 5 D2 B 5 E
Java 알고리즘에 대한 자세한 내용은이 사이트에 관심이있는 독자들이 주제를 볼 수 있습니다. "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작동 팁 요약"및 "Java Cache Operation Tips의 요약"을 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.