给定一个集合,输出它的所有子集(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  



  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值