2015-04-03 51 views
0

不同這程序檢查inputArray的每一種組合並打印 -調用方法輸出從主叫

Checker.java -

package testpj; 

import java.util.ArrayList; 

public class Checker { 
public static void main(String[] args) { 
    String[] subarrayA = {"A0","A1","A2"}; 

    String[] subarrayB = {"B0","B1"}; 
    String[] subarrayC = {"C0","C1","C2","C3"}; 
    String[][] inputArray = {subarrayA, subarrayB, subarrayC}; 
    ArrayList<String> output = new ArrayList<String>(); 
    String output1 = permute(inputArray, 0, output); 
    System.out.println("the output1: "+output1); 
} 

public static String permute(String array[][], int index, ArrayList<String> output){ 

    if(index == array.length){ 
     System.out.println(output.toString()); 
    } 
    else{ 
     for(int i=0 ; i<array[index].length ; i++){ 
      output.add(array[index][i]); 
      permute(array,index+1,output); 
      output.remove(output.size() - 1); 
     } 
    } 
    return output.toString(); 
} 
} 

OUTPUT:

[A0, B0, C0] 
[A0, B0, C1] 
[A0, B0, C2] 
[A0, B0, C3] 
[A0, B1, C0] 
[A0, B1, C1] 
[A0, B1, C2] 
[A0, B1, C3] 
[A1, B0, C0] 
[A1, B0, C1] 
[A1, B0, C2] 
[A1, B0, C3] 
[A1, B1, C0] 
[A1, B1, C1] 
[A1, B1, C2] 
[A1, B1, C3] 
[A2, B0, C0] 
[A2, B0, C1] 
[A2, B0, C2] 
[A2, B0, C3] 
[A2, B1, C0] 
[A2, B1, C1] 
[A2, B1, C2] 
[A2, B1, C3] 
the output1: [] 

爲什麼output1不包含元素?

+0

。所以當然它最終會變成空的。 – forgivenson 2015-04-03 15:32:10

+0

它的工作方式與您編碼的方式完全相同。 – 2015-04-03 15:41:33

回答

0

正確答案是當我遞歸調用置換時,它會重新初始化輸出的值,所以我們最終沒有輸出變量的值。我在permute方法中增加了一個變量,並將輸出添加到它,而不是將輸出添加到輸出本身,它工作。

解決方案:

public ArrayList<String> permute(String array[][], 
int index, ArrayList<String> output, ArrayList<String> comb){ 
     if(index == array.length){ 
      comb.add(output.toString());    
     } 
     else{ 
      for(int i=0 ; i<array[index].length ; i++){ 
       output.add(array[index][i]); 
       permute(array,index+1,output, comb); 
       output.remove(output.size() - 1); 
      } 
     } 

     return comb; 
    } 
每次添加一個元素`output`,您還刪除一次
0

在每一輪中,您都會添加一些東西到output,調用遞歸步驟,然後您將刪除最後一項。

這意味着,如果您從output中的零項開始,那麼最終會得到 - 零長度ArrayList

遞歸調用本身的打印是在刪除項目之前完成的。但最後的印刷品是空的ArrayList。這就是產出不同的原因。