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

给定一个集合,输出它的所有子集(JAVA实现)

2013-05-15 18:40 549 查看
例如给定一个子集{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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: