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

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. Thrift之TProtocol系列TJSONProtocol解析

    在了解JSON协议之前,朋友们可以先去了解一下JSON的基础知识,和ASCII基本分布,关于JSON一些常识请见这里; JSON (JavaScript Object Notation)是一种数据交换 ...

  2. python中的Queue(队列)详解

    一.Queue简介 python中的队列分类可分为两种: 1.线程Queue,也就是普通的Queue 2.进程Queue,在多线程与多进程会介绍. Queue的种类: FIFO:  Queue.Que ...

  3. python实现端口扫描器/DoS/DDoS

    整理github,梳理下Python小工具.以下是python实现的DoS/DDoS/端口扫描器(github). 一.DoS SYN Flood是当前最流行的DoS(拒绝服务攻击)与DdoS(分布式 ...

  4. RequestParam\@ResponseBody

    为什么不写 RequestParam 也能拿到参数 三种写法,test(String name), test(@RequestParam String name), test(@RequestPara ...

  5. junit源码解析--测试驱动运行阶段

    前面的博客里面我们已经整理了junit的初始化阶段,接下来就是junit的测试驱动运行阶段,也就是运行所有的testXXX方法.OK,现在我们开始吧. 前面初始化junit之后,开始执行doRun方法 ...

  6. Spring MVC 配置文件dispatcher-servlet.xml 文件详解(转自 学无止境-yj)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. Linux常用命令(二)--文件目录命令

    1. 列表目录命令: 格式: ls [参数] 用于显示文件或目录信息 选项: -l 每行显示一个文件和目录信息(长格式),简写:ll等同于ls -l 注意:当参数是文件时,显示此文件全部信息 当参数是 ...

  8. Jetson TX2安装固态硬盘(原创)

    SSD on Jetson TX2 注意事项:在断电情况下,将固态硬盘的接线与Jetson TX2进行连接 步骤: 一.jetson tx2开机,打开搜索栏中的Disks 二.Disks显示画面 三. ...

  9. vs2012编译在win7 32位电脑和win xp电脑上运行的win32程序遇到的问题记录

    一.win7 32位电脑: vs2012编译的64位程序是没有问题的.但编译的32位程序在别的电脑(虚拟机模拟)出错: 感觉很无语,vs这么牛逼的东西,在设计时候都不考虑这些吗? 在自己电脑C:\Wi ...

  10. C语言对函数操作的结果声明

    可以用来返回给调用者函数操作的状态值. /* 这是一份关于函数返回值定义的头文件. */ #ifndef _STATUS_H_ #define _STATUS_H_ #define STATUS in ...