Java 通过位运算求一个集合的所有子集方法

 更新时间:2017年03月12日 12:51:26   投稿:jingxian  
下面小编就为大家带来一篇Java 通过位运算求一个集合的所有子集方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Java没有自带的求一个集合的所有子集的方法,我们可以通过集合的子集规律来求。

一个集合的所有子集等于2^该集合的长度。比如{c,b,a}的长度为3,这个集合的子集就有8个。

这句话看起来很简单,但同时也隐含着高深的哲理。其实一个集合的所有集合,和2^该集合的长度这个数字有关。比如上面的例子,{c,b,a}的长度为3,则可以用0-7表示其所有子集。如下所示,改数字所对应的位置为1,则说明我需要这个数字形成子集。从0-7的二进制表示,刚好代表完,一个长度为3,子集个数为8的所有子集。

0(000):{}

1(001):{a}

2(010):{b}

3(011):{ab}

4(100):{c}

5(101):{a,c}

6(110):{b,c}

7(111):{a,b,c}

于是,根据上面的规律,代码可以这样写,先取集合长度,求出2^该集合的长度是多少,比如上面的8,然后从0遍历到8-1。遍历的时候,对0、1、2……每一个数据进行位运算,逐一判断其对应的位数,也就是二进制表示方式,那一位是1。用汇编那种,将每一位移到最末尾,与1的位与实现,具体代码如下:

import java.util.ArrayList;
public class getSubSet {
 public static ArrayList<ArrayList<Integer>> getSubset(ArrayList<Integer> L) {
		if (L.size() > 0) {
			ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
			for (int i = 0; i < Math.pow(2, L.size()); i++) {// 集合子集个数=2的该集合长度的乘方
				ArrayList<Integer> subSet = new ArrayList<Integer>();
				int index = i;// 索引从0一直到2的集合长度的乘方-1
				for (int j = 0; j < L.size(); j++) {
					// 通过逐一位移,判断索引那一位是1,如果是,再添加此项
					if ((index & 1) == 1) {// 位与运算,判断最后一位是否为1
						subSet.add(L.get(j));
					}
					index >>= 1;// 索引右移一位
				}
				result.add(subSet); // 把子集存储起来
			}
			return result;
		} else {
			return null;
	}
}

	public static void main(String[] args) {
	ArrayList<Integer> L = new ArrayList<Integer>();
	L.add(1);
	L.add(2);
	L.add(3);
	System.out.println(getSubset(L));
	}

}

运行结果如下:

以上这篇Java 通过位运算求一个集合的所有子集方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解租约机制以及在hbase中的应用

    详解租约机制以及在hbase中的应用

    这篇文章主要介绍了详解租约机制以及在hbase中的应用的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java各种比较对象的方式的对比总结

    Java各种比较对象的方式的对比总结

    比较对象是面向对象编程语言的一个基本特征.在本教程中,我们将介绍Java语言的一些特性,这些特性允许我们比较对象.此外,我们还将研究外部库中的这些特性,需要的朋友可以参考下
    2021-06-06
  • 对比Java讲解Kotlin中?.与!!.的区别

    对比Java讲解Kotlin中?.与!!.的区别

    这篇文章主要给大家介绍了关于对比Java,实例讲解Kotlin中?.与!!.的区别,文中通过示例代码介绍的非常详细,对大家学习或者使用kotlin具有一定参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • Spring Boot两种配置文件properties和yml区别

    Spring Boot两种配置文件properties和yml区别

    这篇文章主要为大家介绍了java面试中常见问到的Spring Boot两种配置文件properties和yml区别解答,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java中ArrayList在foreach里remove的问题详析

    Java中ArrayList在foreach里remove的问题详析

    这篇文章主要给大家介绍了关于Java中ArrayList在foreach里remove问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-09-09
  • mybatis判断list不为空/大小的问题

    mybatis判断list不为空/大小的问题

    这篇文章主要介绍了mybatis判断list不为空/大小的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 关于mybatis遇到Integer类型的参数时动态sql需要注意条件

    关于mybatis遇到Integer类型的参数时动态sql需要注意条件

    这篇文章主要介绍了关于mybatis遇到Integer类型的参数时动态sql需要注意条件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 关于Spring Bean实例过程中使用反射和递归处理的Bean属性填充问题

    关于Spring Bean实例过程中使用反射和递归处理的Bean属性填充问题

    本文带领大家一起学习下在Spring Bean实例过程中如何使用反射和递归处理的Bean属性填充,需要在类 AbstractAutowireCapableBeanFactory 的 createBean 方法中添加补全属性方法,具体操作方法跟随小编一起学习下吧
    2021-06-06
  • java  异常详解及应用实例

    java 异常详解及应用实例

    这篇文章主要介绍了java 异常详解及应用实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • 基于springboot+jwt实现刷新token过程解析

    基于springboot+jwt实现刷新token过程解析

    这篇文章主要介绍了基于springboot+jwt实现刷新token过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论