1. 程式人生 > >java求集合的子集演算法

java求集合的子集演算法


步驟:1,求出從0到集合子集數目之間的數的二進位制形式            2,根據求的二進位制形式,把集合中在二進位制字串中對應數字為的1的元素取出來,為一個子集。 例子:求集合S(A,B,C,D)的全部子集 public class MySet { public static void main(String[] args) { TreeSet<String> set = new TreeSet<String> (); set.add("A"); set.add("B"); set.add("C"); set.add("D"); ArrayList<TreeSet<String>> subset = getSubset(set); System.out.println("一共有" + subset.size() + "個子集。"); for(TreeSet<String> ts : subset) { System.out.println(ts.toString()); } } //求出從0到集合子集數目(這裡為16)之間的數的二進位制形式,存放在陣列result中 public static String[] getBinaryValue(TreeSet<String> set) { int size = set.size(); int m = (int)Math.pow(2,size) - 1; String[] result = new String[m+1];      for(int i=m;i>-1;i--) { StringBuffer sb = new StringBuffer(Integer.toBinaryString(i)); int length = sb.length();                         if(length < size) { for(int j=0;j<size-length;j++){sb.insert(0, "0");}
} result[i] = sb.toString(); } return result; } //根據二進位制字串生成子集 public static ArrayList<TreeSet<String>> getSubset(TreeSet<String> set) { ArrayList<TreeSet<String>> result = new ArrayList<TreeSet<String>> (); //把集合元素放入陣列中,方便存取 String[] items = new String[set.size()]; int i = 0; for(String item : set) { items[i++] = item; }                 //呼叫二進位制字串生成函式 String[] binaryValue = getBinaryValue(set); //根據二進位制字串取集合元素構成子集 for(int j=0;j<binaryValue.length;j++) { String value = binaryValue[j]; TreeSet<String> subset = new TreeSet<String> (); for(int k=0;k<value.length();k++) { if(value.charAt(k) == '1')subset.add(items[k]); } result.add(subset); } return result; } }