Java 求集合的所有子集
递归方法调用,求解集合的所有子集。
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 求集合的所有子集的更多相关文章
- 傻瓜方法求集合的全部子集问题(java版)
给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, ...
- DFS算法-求集合的所有子集
目录 1. 题目来源 2. 普通方法 1. 思路 2. 代码 3. 运行结果 3. DFS算法 1. 概念 2. 解题思路 3. 代码 4. 运行结果 4. 对比 1. 题目来源 牛客网,集合的所有子 ...
- JAVA求集合中的组合
好几个月没弄代码了,今天弄个求组合的DEMO 思路是将集合的每个值对照一个索引,索引大小是集合的大小+2.索引默认为[000...000],当组合后选取的组合值demo为[0100..00].然后根据 ...
- 【SICP读书笔记(五)】练习2.32 --- 递归求集合子集
题目内容: 我们可以将一个集合表示为一个元素互不相同的表,因此就可以将一个集合的所有子集表示为表的表.例如,假定集合为(1,2,3),它的所有子集的集合就是( () (3) (2) (2 3) (1) ...
- 年年有余之java求余的技巧集合
背景 传说里玉皇大帝派龙王马上降雨到共光一带,龙王接到玉皇大帝命令,立马从海上调水,跑去共光施云布雨,但粗心又着急的龙王不小心把海里的鲸鱼随着雨水一起降落在了共光,龙王怕玉皇大帝责怪,灵机一动便声称他 ...
- Java:集合,Collection接口框架图
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- 【Java】集合_学习笔记
一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...
- java.util 集合框架集合
java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...
- Java:集合框架的工具类
集合框架的工具类 Arrays:里面都是静态方法,直接用来对各种集合进行操作的公有方法. Collections:里面都是静态方法,直接用来对各种集合进行操作的公有方法. 包括: 1.asList将数 ...
随机推荐
- Thrift之TProtocol系列TJSONProtocol解析
在了解JSON协议之前,朋友们可以先去了解一下JSON的基础知识,和ASCII基本分布,关于JSON一些常识请见这里; JSON (JavaScript Object Notation)是一种数据交换 ...
- 怎么解决ERROR in Node Sass does not yet support your current environmen问题?
好久没有重新安装node.js,昨天和小伙伴们一起安装,由于自己是在网上自行下载的node,安装地比较顺利,但另外两个小伙伴用的共享文件夹里自带的node,却是屡次碰到问题,快被逼疯,在运行Vue时总 ...
- Spring Boot实战:拦截器与过滤器
一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...
- winform打开本地html页面
有时候为了提高开发效率和后期可维护性,把cs里面嵌套了远程网页,这样方便后期升级.比如,美图秀秀,qq音乐PC都嵌套了本地和远程网页.在页面拖入控件System.Windows.Forms.WebBr ...
- java8-新特性--(接口的默认方法与静态方法)
Java 8用默认方法与静态方法这两个新概念来扩展接口的声明. public interface Inte{ void method(); default void defaultMethod(){ ...
- pandas读取excel中指定数据的行数
shuju = pd.read_excel(filename) loandata = pd.DataFrame(shuju) ncol = (len(loandata.keys())) data = ...
- 共轭梯度算法求最小值-scipy
# coding=utf-8 #共轭梯度算法求最小值 import numpy as np from scipy import optimize def f(x, *args): u, v = x a ...
- JAVA中文件与Byte数组相互转换的方法
JAVA中文件与Byte数组相互转换的方法,如下: public class FileUtil { //将文件转换成Byte数组 public static byte[] getBytesByFile ...
- Android4.0新控件
谷歌在推出Android4.0的同时推出了一些新控件,Android4.0中最常用的新控件有下面5种. 1. Switch的使用 Switch顾名思义,就是开关的意思,有开和关两种状态. 当Swit ...
- java 数组与集合(list)相互转化
上代码 package com.core.array2collection; import java.util.ArrayList; import java.util.Arrays; import j ...