递归方法调用,求解集合的所有子集。

package ch01;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set; public class QuerySubSet {

  // 递归调用, 求出 Set的子集, 返回List列表
public static List<Set<Object>> Query(Set<Object> target)
{
    // 如果 target为空, 则停止递归,并且 返回的list中 包含一个空集
if(target.size() == 0)
{
List<Set<Object>> list= new LinkedList<Set<Object>>();
list.add(target);
return list;
}
     // 如果 target 中有一个元素, 那么改target的子集体包括 空集 和 自身
     else if(target.size() == 1)
{
List<Set<Object>> list= new LinkedList<Set<Object>>();
list.add(target);
Set<Object> nullset=new HashSet<Object>();
list.add(nullset);
return list;
}
// 如果 target中的元素大于 1 个,则将target分成两个新的集合,并求出两个新集合的所有子集,再将两个List子集进行合并,即可以得到target的所有子集。
else
{
Iterator<Object> iter=target.iterator();
Object elem=iter.next();
target.remove(elem);
Set<Object> newSet=new HashSet<Object>();
newSet.add(elem); List<Set<Object>> list1=Query(newSet); // 递归调用
List<Set<Object>> list2=Query(target); // 递归调用
return merge(list1, list2); // 合并两个 list
}
}

   // 合并两个list, 两次for循环遍历两个list列表。
public static List<Set<Object>> merge(List<Set<Object>> list1, List<Set<Object>> list2)
{
List<Set<Object>> mlist=new LinkedList<Set<Object>>();
for(Set<Object> set1: list1 )
for(Set<Object> set2: list2)
{
Set<Object> newSet=new HashSet();
newSet.addAll(set1);
newSet.addAll(set2);
mlist.add(newSet);
}
return mlist;
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<Object> targ=new HashSet<Object>();
for(int i=0; i<10; i++)
{
targ.add(Integer.toString(i));
} List<Set<Object>> allsubset= QuerySubSet.Query(targ); boolean f1=true;
for(Set<Object> set1: allsubset)
{
if(!f1)
System.out.print(",");
f1=false; System.out.print("{"); boolean f2=true;
for(Object obj: set1)
{
if(!f2)
System.out.print(",");
f2=false;
System.out.print(obj.toString());
}
System.out.println("}");
} } }

Java 求集合的所有子集的更多相关文章

  1. 傻瓜方法求集合的全部子集问题(java版)

    给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, ...

  2. DFS算法-求集合的所有子集

    目录 1. 题目来源 2. 普通方法 1. 思路 2. 代码 3. 运行结果 3. DFS算法 1. 概念 2. 解题思路 3. 代码 4. 运行结果 4. 对比 1. 题目来源 牛客网,集合的所有子 ...

  3. JAVA求集合中的组合

    好几个月没弄代码了,今天弄个求组合的DEMO 思路是将集合的每个值对照一个索引,索引大小是集合的大小+2.索引默认为[000...000],当组合后选取的组合值demo为[0100..00].然后根据 ...

  4. 【SICP读书笔记(五)】练习2.32 --- 递归求集合子集

    题目内容: 我们可以将一个集合表示为一个元素互不相同的表,因此就可以将一个集合的所有子集表示为表的表.例如,假定集合为(1,2,3),它的所有子集的集合就是( () (3) (2) (2 3) (1) ...

  5. 年年有余之java求余的技巧集合

    背景 传说里玉皇大帝派龙王马上降雨到共光一带,龙王接到玉皇大帝命令,立马从海上调水,跑去共光施云布雨,但粗心又着急的龙王不小心把海里的鲸鱼随着雨水一起降落在了共光,龙王怕玉皇大帝责怪,灵机一动便声称他 ...

  6. Java:集合,Collection接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  7. 【Java】集合_学习笔记

    一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...

  8. java.util 集合框架集合

    java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...

  9. Java:集合框架的工具类

    集合框架的工具类 Arrays:里面都是静态方法,直接用来对各种集合进行操作的公有方法. Collections:里面都是静态方法,直接用来对各种集合进行操作的公有方法. 包括: 1.asList将数 ...

随机推荐

  1. 分析业务模型-类图(Class Diagram)

    分析业务模型-类图(Class Diagram)     分析业务模型-类图(Class Diagram)(上) 摘要:类图(Class Diagram)可能是用得最多的一种UML图.类图的基本语法并 ...

  2. 如何激活Microsoft Office 2010?

    Microsoft Office安装完成之后通常都是未激活的,怎样激活这个软件呢? 百度经验:jingyan.baidu.com 工具/原料 Office 2010 Toolkit软件 百度经验:ji ...

  3. 修改ncnn的openmp异步处理方法 附C++样例代码

    ncnn刚发布不久,博主在ios下尝试编译. 遇上了openmp的编译问题. 寻找各种解决方案无果,亲自操刀. 采用std::thread 替换 openmp. ncnn项目地址: https://g ...

  4. 1.MAVEN项目的创建与问题的解决

    一.创建一个maven-webapp.(环境:mac和15版本的IDEA) 二.next--->填写groupId(公司单位的名字,你组织的名字)和ArtifactID(有关tomcat,以后用 ...

  5. MyCat 启蒙:分布式系统的数据库架构演变

    文章首发于[博客园-陈树义],点击跳转到原文<MyCat 启蒙:分布式系统的数据库架构演变> 单数据库架构 一个项目在初期的时候,为了尽可能快地验证市场,其对业务系统的最大要求是快速实现. ...

  6. MySQL如何选择合适的引擎以及引擎的转换。

    我们怎么选择合适的引擎?这里简单归纳一句话:"除非需要用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该优先选择InnoDB引擎." 除非万不得已,否则不建议混 ...

  7. scala 小结(一)

    Scala 是什么?(What is scala?)   引用百度百科对于scala的定义: Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编 ...

  8. HTTP请求和MIME介绍

    HTTP请求和MIME介绍 HTTP请求由三部分组成,分别是: 请求行,消息报头,请求正文. 请求行(格式): Method Request-URI HTTP-Version CRLF Method: ...

  9. gulp压缩文件最简示例

    安装gulp-uglify 作为项目的开发依赖即可 $ npm gulp-uglify --save-dev 压缩js文件 gulpfile.js const gulp = require('gulp ...

  10. 读Ghost博客源码与自定义Ghost博客主题

    我使用的Ghost博客一直使用者默认的Casper主题.我向来没怎么打理过自己博客,一方面认为自己不够专业,很难写出质量比较高的文字:另一方面认为博客太耗时间,很容易影响正常的工作内容.最近公司即将搬 ...