您的位置:首页 > 编程语言 > Java开发

求子集

2016-09-18 18:19 113 查看
任务: 求子集    4个元素     2^4个子集。

原理:

   将4个元素用二进制数来表示--0000。假如有A,B,C,D四个元素,

   0000--{}, 0001--{D}子集,0010--{C},0011--{C,D},……,1111--{A,B,C,D}。   

package my_review;

import java.util.ArrayList;

import java.util.HashSet;

public class ChildArr {

public static void main(String[] args) {

HashSet<String> ha = new HashSet<>();
ha.add("A");
ha.add("B");
ha.add("C");
ha.add("D");
ArrayList<HashSet<String>> list = getList(ha);
System.out.println("子集的个数为:"+list.size());
for(HashSet<String> set:list){
System.out.println(set);
}
}
//根据集合的个数来生成二进制字符串,用字符串数组去存储二进制数
public static String[] getarr(HashSet<String> set) {
int num = set.size();//集合的长度
//int arrNum = 1<<num;
int arrNum = (int) Math.pow(2, num);//字符串长度
String[] resultArr = new String[arrNum];
for (int i = 0; i < arrNum; i++) {
String binstr = Integer.toBinaryString(i);
StringBuffer sb = new StringBuffer(binstr);
/*for (int j = 0; j < num; j++) {//拼凑成4位二进制数
if (sb.length() < num) {
sb.insert(0, "0");
}
}*/
while (sb.length() < num) {
for (int j = 0; j < num-sb.length(); j++) {//拼凑成4位二进制数
sb.insert(0, "0");
}
}
resultArr[i] = sb.toString();
}
return resultArr;
}

//运用生成的二进制字符串去创建子集
private static ArrayList<HashSet<String>> getList(HashSet<String> set) {
ArrayList<HashSet<String>> resultList = new ArrayList<>();

String[] arr2 = new String[set.size()];//存放集合的元素的数组,方便后面选取元素
int index = 0;
for (String str : set) {
arr2[index++] = str;
}

String[] setArr = getarr(set);//获取hashset生成的二进制字符串
//["0000","0001","0011"......]
for (int i = 0; i < setArr.length; i++) {
HashSet<String> resultSet = new HashSet<>();//最终的存放子集hashset,解决有重复元素的情况
for (int j = 0; j < setArr[i].length(); j++) {
if (setArr[i].charAt(j)=='1') {
resultSet.add(arr2[j]);
}
}
resultList.add(resultSet);
}
return resultList;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA 子集 IT