求子集
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;
}
}
原理:
将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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 【CF 应用开发大赛】IT Share(IT分享网)
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序