输出集合的所有子集java_给定一个集合,输出它的所有子集(JAVA实现) | 学步园...

例如给定一个子集{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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值