2017-03-22 157 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

在代码审查中,我会拒绝这个,因为疯狂和难以理解的位摆弄。我不知道那里发生了什么。 –