JAVA求集合中的组合
好几个月没弄代码了,今天弄个求组合的DEMO
思路是将集合的每个值对照一个索引,索引大小是集合的大小+2.索引默认为[000...000],当组合后选取的组合值demo为[0100..00]。然后根据遍历索引来到集合中取值。
上代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class ComBit { public static void main(String[] args) {
// Integer test
int[] combination = new int[] { 1, 2, 3, 4 };
List<Integer> combinationlist = new ArrayList<Integer>();
for (Integer integer : combination) {
combinationlist.add(integer);
}
ComBitIterator<Integer> i = new ComBitIterator<Integer>(combinationlist);
while (i.hasNext()) {
Object obj = i.next();
System.out.println(obj.toString());
}
// String test
String[] str = new String[] { "apple", "orange", "tomato", "potato" };
List<String> combinationSlist = new ArrayList<String>();
for (String s : str) {
combinationSlist.add(s);
}
ComBitIterator<String> ii = new ComBitIterator<String>(combinationSlist);
while (ii.hasNext()) {
Object obj = ii.next();
System.out.println(obj.toString());
} } } class ComBitIterator<T> implements Iterator<T> { private int[] _bitArray = null; protected final int _length; protected final List<T> combination; protected List<T> _currentSet; public ComBitIterator(List<T> combination) {
_currentSet = new ArrayList<T>();
this._length = combination.size();
this._bitArray = new int[_length + 2];
this.combination = combination;
} @Override
public boolean hasNext() {
return _bitArray[_length + 1] != 1;
} @SuppressWarnings("unchecked")
@Override
public T next() {
_currentSet.clear();
for (int index = 1; index <= _length; index++) {
if (_bitArray[index] == 1) {
T value = combination.get(index - 1);
_currentSet.add(value);
}
}
int i = 1;
while (_bitArray[i] == 1) {
_bitArray[i] = 0;
i++;
}
_bitArray[i] = 1;
return (T) _currentSet;
} }
------------------------------------------------分割线---------------------------------------------------------
PS:代码源于要求求数字1-20中 任取N的组合后合值为36,于是思路想到两种,第一种是递归,第二种虽然也是递归,但是想弄个通用的,就有了以上的代码。另外群里有人写出了直接递归的代码,也附上:
public static void main(String[] args) {
combinateDataOfRange(1, 20, 36);
}
public static void combinateDataOfRange(int min, int max, int target) {
combinateData(0, min, max, target, new Stack<Integer>());
}
public static void combinateData(int sum, int min, int max, int target,
Stack<Integer> stack) {
for (int i = stack.isEmpty() ? min : (Integer) stack.lastElement() + 1; i < max; ++i) {
int tempSum = sum + i;
stack.push(i);
if (tempSum == target) {
System.out.println(stack + "=" + target);
} else {
combinateData(tempSum, min, max, target, stack);
}
stack.pop();
}
}
JAVA求集合中的组合的更多相关文章
- Java求字符串中出现次数最多的字符
Java求字符串中出现次数最多的字符 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51933611 Java ...
- SQL_求集合中每天最大时间记录的总和
--问题求 集合中每天最大时间的总和 表中的数据 列: 用户 分数 时间 A 2 2014-01-01 01:00:00 A 2 2014-01-01 02:00:00 A 2 2014-01-01 ...
- Java 求字符串中出现频率最高字符
前段时间接触的这个题目,大体理解了,还有些小地方仍待进一步品味,暂且记下. import java.util.ArrayList; import java.util.Arrays; import ja ...
- Java Collection集合中的iterator方法
Iterator接口的概述 /** * java.util.Iterator接口:选代器(对集合进行遍历) * 有两个常用的方法 * boolean hasNext() * 如果仍有元素可以迭代,则返 ...
- Java 求集合的所有子集
递归方法调用,求解集合的所有子集. package ch01; import java.util.HashSet; import java.util.Iterator; import java.uti ...
- java List集合中contains方法总是返回false
ArrayList的contains方法 java 今天在用ArrayList类的caontains方法是遇到了问题,我写了一个存放User类的ArrayList 但在调用list.contains( ...
- Java:求字符串中邻接的数字为一个整体
public static void main(String[] args) { String strNumbers = "0123456789";//用来进行判断数字的 Syst ...
- JAVA 求数组中的最大值
package Code411;//求数组的最大值public class CodeArrayMax { public static void main(String[] args) { int ar ...
- [改善Java代码]集合中的元素必须做到compareTo和equals同步
实现了Comparable接口的元素就可以排序,
随机推荐
- jquery做表格变色效果-demo
第一步:写html代码部分: <table style="width:300px;"> <tr><td>1</td></tr& ...
- HTML 5 音频
HTML 5 音频 ================================================================================= 音频是视频的重要 ...
- LoadRunner使用之变量参数化
LR性能测试之参数化设置 Q:何为参数化? LR在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本,如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如 ...
- (转)jQuery源码解读 -- jQuery v1.10.2
原文GitHub链接: https://github.com/chokcoco/jQuery-
- 据说年薪30万的Android程序员必须知道的帖子
Android中国开发精英 目前包括: Android开源项目第一篇--个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager.Gallery.G ...
- Ad hoc sql
SQL Server如何启用Ad Hoc Distributed Queries? 2011-08-11 14:53 wangdingbang CSDN博客 字号:T | T 本文主要介绍了SQL ...
- VBS整人代码
记得刚开始学VB脚本语言的时候,写了一段调用系统进程的代码,挺好的: dim wshif msgbox("笑笑很帅",vbyesno,"请回答是或否")=vby ...
- 关于editor网页编辑器ueditor.config.js 配置图片上传
最近公司项目在做一个门户网站,其中新闻和简介等部分使用到了ueditor编辑器,但是上级明确指示需要图片上传这个功能,这时却发现图片上传功能不能正常使用,上传时一直报错,网上收了好几个处理办法,都说的 ...
- Linux截屏工具scrot用法详细介绍
Scrot是Linux命令行中使用的截图工具,能够进行全屏.选取等操作,下面小编将针对Scrot截图工具的用法给大家做个详细介绍,通过操作实例来学习Scrot的使用. 在Linux中安装Scrot ...
- sort排序
/*问题 L: 使用sort排序题目描述标准库的sort函数给我们提供了一个很方便的排序的方法,光听别人说方便不顶事,得自己亲自实践一下才能体会到它的方便之处. 输入每组包含多组数据,每组数据第一行包 ...