2012-09-27 111 views
2

我試圖返回字符串數組中值的所有可能的排列組合。我已經提出了以下代碼,使所有可能的排列組合;它工作正常。Java - 從遞歸函數返回

private void combineArray(String sPrefix, String[] sInput, int iLength) { 
    if (iLength == sPrefix.length()) { 
     //This value should be returned and concatenated: 
     System.out.println(sPrefix); 
    } else { 
     for (int i=0; i<sInput.length; i++) { 
      combineArray(sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength); 
     } 
    } 
} 

如果我把{X,Y,Z}它打印到控制檯:

xyz 
xzy 
yxz 
yzx 
zxy 
zyx 

我的問題是,我不能找到一種方法將這些值恢復到原來的呼叫功能。所以我希望這個函數不返回'void',而是返回一個包含sPrefix連接值的'String'。

我一直在努力這一段時間,現在我似乎無法再看清楚了。 :) 任何幫助,將不勝感激。

+3

爲什麼不返回所有列表字符串組合添加?更好,不是嗎? – thatidiotguy

+0

只是拋出想法,但是你可以在每次迭代過程中改變外部數組,還是返回可以通過每個遞歸級別返回的值數組? – Xiphos

+0

是的,只是從遞歸例程中返回數據。您可以返回一個常規的'[]'數組,或者其中一個集合類,後者在您從每個級別返回時都可以添加到其中。 –

回答

3

而不是返回一個列表,我想可能更好地工作,通過列表作爲參數,並填充它裏面的方法:

private void combineArray(List<String> lOut, String sPrefix, String[] sInput, int iLength) { 
    if (iLength == sPrefix.length()) { 
     //This value should be returned and concatenated: 
     System.out.println(sPrefix); 
     lOut.add(sPrefix); 
    } else { 
     for (int i=0; i<sInput.length; i++) { 
      combineArray(lOut, sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength); 
     } 
    } 
} 

然後,您可以有一個創建了new ArrayList<String>,它傳遞到上面的方法,並返回一個包裝方法。

1

你可以有一個ArrayList<String>和所有的字符串添加到它..然後你可以返回此ArrayList ..

List<String> listString = new ArrayList<>(); 
private void combineArray(String sPrefix, String[] sInput, int iLength) { 
    if (iLength == sPrefix.length()) { 
     listString.add(sPrefix); 
     //This value should be returned and concatenated: 
     System.out.println(sPrefix); 
    } else { 
     for (int i=0; i<sInput.length; i++) { 
      combineArray(sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength); 
     } 
    } 
    return listString; 
} 
0

不斷追加到相同的輸出..就像這樣:

private String combineArray(String sPrefix, String[] sInput, int iLength, String output) { 
    if (iLength == sPrefix.length()) { 
     //This value should be returned and concatenated: 
     System.out.println(sPrefix); 
     output = output+"|+sPrefix; 
     return output; 
    } else { 
     for (int i=0; i<sInput.length; i++) { 
      output = combineArray(sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength, output); 
     } 
    } 
} 

您還可以使用,而不是一個String一個ListArray,一旦基本概念工程..