2016-12-31 113 views
0

我需要生成所有可能的顏色組合(我有8種不同的顏色)的列表,並且希望指定輸出的length,而無需進入代碼並添加另一個循環。更簡單的方法來做很多嵌套for循環

for (int s1 = 0; s1 < kinds.length; s1++) { 
     for (int s2 = 0; s2 < kinds.length; s2++) { 
      for (int s3 = 0; s3 < kinds.length; s3++) { 
       for (int s4 = 0; s4 < kinds.length; s4++) { 
        for (int s5 = 0; s5 < kinds.length; s5++) { 
         String[] guess = new String[length]; 
         guess[0] = colors[s1]; 
         guess[1] = colors[s2]; 
         guess[2] = colors[s3]; 
         guess[3] = colors[s4]; 
         guess[4] = colors[s5]; 
         Possible.add(guess); 

        } 
       } 
      } 
     } 
    } 
+0

的可能的複製[獲取的字符串的每一種可能的排列或組合,包括在Java中重複字符](http://stackoverflow.com/questions/5113707/getting-every-possible-permutation-of-a-包含字符串或組合的字符) – ACascarino

+0

您只需要1個循環就像增加時鐘一樣。 – Enzokie

+0

[Combinatorics:生成所有「狀態」 - 數組組合]可能的重複(http://stackoverflow.com/q/9632677/5221149) – Andreas

回答

0

您可以使用遞歸而不是循環。總的想法是所有可能的組合都可以從所有可能的第一顏色concat與其餘的組合中產生。

private static List<String> possibles = new ArrayList<>(); 

private static void combi(char[] arr, char[] out, int start, int end, int index, int length) { 
    if (index == length) { 
     possibles.add(new String(out)); 
     return; 
    } 

    for (int i = start; i <= end && end - i + 1 >= length - index; i++) { 
     out[index] = arr[i]; 
     combi(arr, out, i + 1, end, index + 1, length); 
    } 
} 

private static void compute(char[] colors, int length) { 
    char[] output = new char[length]; 
    combi(colors, output, 0, colors.length - 1, 0, length); 
} 

public static void main(String[] args) { 
    char[] colors = {'a', 'b', 'c', 'd', 'e'}; 
    int length = 3; 
    compute(colors, length); 

    for (String possible : possibles) { 
     System.out.println(possible); 
    } 
} 
+0

有人可以請解釋一點。 –

+0

@KaminPallaghy更新了我的答案。讓我知道如果它仍然不清楚。 – pt2121

+0

謝謝。這很容易 –