例如给定一个子集{1,2,3},则它的所有子集为 : {}, {1}, {2}, {3}, {1,2}, {1,3}, {2,3},, {1,2,3}。
代码如下:
/**
* @Title: SetUtil.java
* @Package
* @Description: 给定一个集合,输出所有的子集
* @author Mr.Simple
* @date May 15, 2013 5:01:24 PM
* @version V1.0
*/
public class SetUtil {
public static int mSetsCount = 1;
/**
*
* @Title: getSubSets
* @Description: 给定一个集合,输出所有的子集
* @param sets
* 给定的子集
* @return void 无返回
* @throws
*/
public static void getSubSets(int[] sets) {
if (null == sets) {
println("null == sets");
return;
}
int len = sets.length;
// 获得所有子集数
int count = (int) Math.pow(2, len);
println("空集 : {}");
// 输出所有子集
for (int i = 1; i < count; i++) {
// 将整数转换成字符串,如果前面为0则会被去掉,比如001,则会显示为1
String binaryStr = Integer.toBinaryString(i);
print("二进制为: " + binaryStr + ", 对应的子集为: {");
// 二进制字符串的长度
int binLen = binaryStr.length() - 1;
// 遍历二进制字符串,(每次遍历输出一个子集)
for (int j = len-1; j >= 0 && binLen >= 0; j--, binLen--) {
// 二进制 数为1的,则输出对应位置的数值
if (binaryStr.charAt(binLen) == '1') {
print(sets[j] + ",");
}
}
println("}; ");
// 子集数加1
mSetsCount++;
}
}
/**
*
* @Title: print
* @Description: 输出数据
* @param msg 要输出的内容
* @return void
* @throws
*/
private static void print(String msg) {
System.out.print(msg + " ");
}
/**
*
* @Title: println
* @Description: 输出数据
* @param msg 要输出的内容
* @return void
* @throws
*/
private static void println(String msg) {
System.out.println(msg + " ");
}
} // end of class
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
/**
* @Title: SetUtilTest.java
* @Package
* @Description:
* @author Mr.Simple bboyfeiyu@gmail.com
* @date May 15, 2013 6:25:48 PM
* @version V1.0
*/
public class SetUtilTest {
@Test
public void testGetSubSets() {
// test 1
int[] sets = {1,2,3,4};
// 获得子集数
int count = (int)Math.pow(2, sets.length) ;
// 测试函数
SetUtil.getSubSets(sets) ;
assertEquals(count, SetUtil.mSetsCount) ;
// test 2
int[] sets2 = {1,2,3};
SetUtil.mSetsCount = 1;
SetUtil.getSubSets(sets2) ;
count = (int)Math.pow(2, sets2.length) ;
assertEquals(count, SetUtil.mSetsCount) ;
// test 3
SetUtil.getSubSets(null) ;
}
}
输出结果为:
空集 : {}
二进制为: 1, 对应的子集为: { 4, };
二进制为: 10, 对应的子集为: { 3, };
二进制为: 11, 对应的子集为: { 4, 3, };
二进制为: 100, 对应的子集为: { 2, };
二进制为: 101, 对应的子集为: { 4, 2, };
二进制为: 110, 对应的子集为: { 3, 2, };
二进制为: 111, 对应的子集为: { 4, 3, 2, };
二进制为: 1000, 对应的子集为: { 1, };
二进制为: 1001, 对应的子集为: { 4, 1, };
二进制为: 1010, 对应的子集为: { 3, 1, };
二进制为: 1011, 对应的子集为: { 4, 3, 1, };
二进制为: 1100, 对应的子集为: { 2, 1, };
二进制为: 1101, 对应的子集为: { 4, 2, 1, };
二进制为: 1110, 对应的子集为: { 3, 2, 1, };
二进制为: 1111, 对应的子集为: { 4, 3, 2, 1, };
空集 : {}
二进制为: 1, 对应的子集为: { 3, };
二进制为: 10, 对应的子集为: { 2, };
二进制为: 11, 对应的子集为: { 3, 2, };
二进制为: 100, 对应的子集为: { 1, };
二进制为: 101, 对应的子集为: { 3, 1, };
二进制为: 110, 对应的子集为: { 2, 1, };
二进制为: 111, 对应的子集为: { 3, 2, 1, };
null == sets