2017-03-22 105 views
2

我試圖找到數組中的字符串組合{"A","B","C"}而不重複,並且元素的順序應保留在子集中。 所需的訂單是[["B","C"], ["A","C"], ["A","B"], ["A","B","C"], ["A"], ["C"], ["B"]]。我曾嘗試使用在此question中找到的答案編寫邏輯,並且發現元素的順序未保留。在Java中查找數組中所有字符串的組合

public static Set <JSONArray> getCombinations(int k , JSONArray properties) 
     { 
      Set <JSONArray> combinations = new LinkedHashSet <JSONArray>(); 
      try 
       { 
        if (k == 0) 
         { 
          combinations.add(new JSONArray()); 
          return combinations; 
         } 
        for (int i = 0 ; i < properties.length() ; i++) 
         { 
          String element = properties.getString(i); 
          JSONArray sublist = getSublist(properties , i + 1); 
          combinations.add(sublist); 
          Set <JSONArray> combinations2 = getCombinations(k - 1 , sublist); 
          for (JSONArray previous : combinations2) 
           { 

            previous.put(element); 
            combinations.add(previous); 
           } 
         } 
       } 
      catch (Exception e) 
       { 
        System.out.println("Exception :: " + e); 
       } 
      return combinations; 
     } 

    public static JSONArray getSublist(JSONArray list , int i) throws JSONException 
     { 
      JSONArray sublist = new JSONArray(); 
      for (int j = i ; j < list.length() ; j++) 
       { 
        sublist.put(list.getString(j)); 
       } 
      return reverseArray(sublist); 
     } 

輸出爲:: [["B","C"], ["C","A"], ["B","A"], ["C","B","A"], ["A"], ["C"], ["B"]]。但我需要保存命令,如[「C」,「A」]應該是[「A」,「C」]。任何想法都會有幫助。

PS:子集的順序並不重要,但子集內的元素的順序是。

+0

爲什麼要B,C來之前A,C?或者a,b?我不知道「保持初始秩序」。或者它只是:它應該是a,c而不是c,a? – GhostCat

+0

是的,它應該是a,b,而不是b,a。子集的順序無關緊要,但子集內的元素順序是。 – User

回答

2

組合可以用數字表示 - 以二進制形式,每個位置的數字表示該元素是否存在。例如。 5 = 101 - > {A,C}

因此,讓我們遍歷組合=範圍< 0..2^n-1>中的數字,並獲取與該數字對應的元素,它表示索引存在於組合的二進制表示。

public class Combins { 

      static String[] a = new String[] { "A", "B", "C" }; 

      public static void main(final String[] args) { 

       final int maxbit = 1 << a.length; 

       //for each combination given by a (binary) number 'p'... 
       for (int p = 0; p < maxbit; p++) { 
        final List<String> res = new ArrayList<String>(); 

        //evaluate if array 'a' element at index 'i' is present in combination (and include it if so) 
        for (int i = 0; i < a.length; i++) { 
         if ((1 << i & p) > 0) { 
          res.add(a[i]); 
         } 
        } 
        System.out.println(Arrays.toString(res.toArray())); 
       } 
      } 
     } 

輸出是:

[] 
[A] 
[B] 
[A, B] 
[C] 
[A, C] 
[B, C] 
[A, B, C] 
+0

是的,這項工作完美像我需要的。 – User

+3

其中:爲了讓你的答案真的對別人有幫助,你可能想解釋一下你是否使用的條件......你看,這些代碼只是回答「確定」,但不是真的。如果你想說服人們upvote(而不是downvote)...考慮添加一些解釋。 – GhostCat

+3

在代碼審查中,我會拒絕這個,因爲瘋狂和難以理解的位擺弄。我不知道那裏發生了什麼。 –

相關問題