2017-02-18 87 views
0

我需要從2d數組創建所有可能的字符串,以便第一個字符來自charArray[0],第二個字符來自charArray[1] ...而最終字符來自charArray[keyLength-1]從2維字符數組遞歸創建字符串

實施例:

輸入:

char[][] charArray = 
{{'m','M','L','S','X'} 
{'e','E','o','N','Z'} 
{'o','G','F','r','Y'} 
{'D','H','I','J','w'}}; 

輸出:

{meoD, meoH, meoI,..., XZYJ, XZYw} //in an Array or ArrayList 

我有一個竣工圖與樹中的每個字符的工作溶液charArray[0]作爲根,它做了一個深度優先的字符串構造,但是JVM用完了charArray長度小於12的內存。我通常會採用迭代方法,但是charArray長度(即關鍵字字符串長度)是在運行時決定的,我想找到一個更完整的解決方案,而不是在關鍵字符串長度上編寫switch語句,並手動寫出有限數量的關鍵字符串長度的循環。

我一直被困在我的程序的這一小段比我想承認的更長,所以任何幫助將不勝感激!

+1

如果你把代碼放在這裏,這會很容易理解。 – Maverick

+0

即使charArray是在運行時確定的,你有數組的長度字段 – hhafeez

+0

@hhafeez是的,但問題來自嘗試處理數組中的字符。我可以找出最好的迭代解決方案將需要在最終嵌套循環內的行如下所示:keyArrayList.add(charArray [0] .charAt(a)+ charArray [1] .charAt(b)+ .... + charArray(keyLength-1).charAt(x)。也就是說,我需要爲每個charArray [i]手動編寫一個charAt語句,如果charArray的長度變化很大,這顯然會出現問題。 – mjf

回答

0

這裏是如何可以解決:

import java.util.ArrayList; 
import java.util.List; 

public class Arrays2D { 

public static void main(String[] args) { 
    //input keys 

    String[][] charArray = 
     {{"m","M","L","S","X"}, 
     {"e","E","o","N","Z"}, 
     {"o","G","F","r","Y"}, 
     {"D","H","I","J","w"}}; 
    //print output 
    System.out.println(findCombinations(charArray)); 

} 

private static List<String> findCombinations(String[][] charArray) { 
    List<String> prev = null; 
    for (int i = 0; i < charArray.length; i++) { 
     List<String> curr = new ArrayList<String>(); 
     for (int j = 0; j < charArray[i].length; j++) { 
      if (i + 1 < charArray.length) { 
      for (int l = 0; l < charArray[i+1].length; l++) { 
        String s = charArray[i][j] + charArray[i + 1][l]; 
        curr.add(s); 
       } 
      } 

     } 
     if (prev != null && !curr.isEmpty()) { 
      prev = join(prev, curr); 
     } 
     if (prev == null) 
      prev = curr; 

    } 

    return prev; 
} 

public static List<String> join(List<String> p, List<String> q) { 
    List<String> join = new ArrayList<String>(); 
    for (String st1 : p) { 
     for (String st2 : q) { 

      if (st1.substring(st1.length() - 1).equals(st2.substring(0, 1))) { 
       String s = st1 + st2; 
       s = s.replaceFirst(st1.substring(st1.length() - 1), ""); 
       join.add(s); 
      } 

     } 
    } 

    return join; 
} 
} 

我已經檢查並正確生成的組合。您可以運行並查看輸出。

+0

你是最棒的!非常感謝您花時間弄清楚這一點。如果你不介意,你能否幫我理解你的連接方法的IF部分。它對我來說似乎仍然很神奇。 – mjf

+0

僅供參考,供將來讀者閱讀:由於「[」和「]」是charArray中可能的字符,我發現我需要在join()中的If語句內額外添加if語句以分別處理它們。即,如果(st1​​.substring(st1.length()-1).equals(「[」)){\t \t s = s.replaceFirst(「\\ [」,「」); (st1.substring(st1.length() - 1).equals(「]」)){ \t s = s.replaceFirst(「\\]」,「」); } else { s = s.replaceFirst(st1.substring(st1.length() - 1),「」); } join.add(s); 對不起格式 – mjf

+0

是的,我也可以解釋一下。同時,如果它對你有幫助,你會接受答案嗎? – hhafeez