好几个月没弄代码了,今天弄个求组合的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求集合中的组合的更多相关文章

  1. Java求字符串中出现次数最多的字符

    Java求字符串中出现次数最多的字符  [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51933611      Java ...

  2. SQL_求集合中每天最大时间记录的总和

    --问题求 集合中每天最大时间的总和 表中的数据 列: 用户 分数 时间 A 2 2014-01-01 01:00:00 A 2 2014-01-01 02:00:00 A 2 2014-01-01 ...

  3. Java 求字符串中出现频率最高字符

    前段时间接触的这个题目,大体理解了,还有些小地方仍待进一步品味,暂且记下. import java.util.ArrayList; import java.util.Arrays; import ja ...

  4. Java Collection集合中的iterator方法

    Iterator接口的概述 /** * java.util.Iterator接口:选代器(对集合进行遍历) * 有两个常用的方法 * boolean hasNext() * 如果仍有元素可以迭代,则返 ...

  5. Java 求集合的所有子集

    递归方法调用,求解集合的所有子集. package ch01; import java.util.HashSet; import java.util.Iterator; import java.uti ...

  6. java List集合中contains方法总是返回false

    ArrayList的contains方法 java 今天在用ArrayList类的caontains方法是遇到了问题,我写了一个存放User类的ArrayList 但在调用list.contains( ...

  7. Java:求字符串中邻接的数字为一个整体

    public static void main(String[] args) { String strNumbers = "0123456789";//用来进行判断数字的 Syst ...

  8. JAVA 求数组中的最大值

    package Code411;//求数组的最大值public class CodeArrayMax { public static void main(String[] args) { int ar ...

  9. [改善Java代码]集合中的元素必须做到compareTo和equals同步

    实现了Comparable接口的元素就可以排序,

随机推荐

  1. linux 调用java main方法

    #!/bin/shexport LANG=zh_CNtimestamp=`date +%Y%m%d%H%M`/opt/java6/bin/java -Xms128m -Xmx512m -Dfile.e ...

  2. mac攻略(七) -- 环境变量PATH分析

      一.首先需要了解 1>mac 一般使用bash作为默认shell 2>Mac系统的环境变量,加载顺序为: 1.系统级别的 /etc/profile /etc/bashrc /etc/p ...

  3. 如何使用xshell远程连接ubuntu

    在Ubuntu上安装ssh就可以使用xshell登录了,安装步骤: 1,sudo apt-get install openssh-server 2,然后启动ssh sudo /etc/init.d/s ...

  4. 话说C++中的左值、纯右值、将亡值

    写在前面 C++中有“左值”.“右值”的概念,C++11以后,又有了“左值”.“纯右值”.“将亡值”的概念.关于这些概念,许多资料上都有介绍,本文在拾人牙慧的基础上又加入了一些自己的一些理解,同时提出 ...

  5. Oracle(创建序列)

    概念: 所谓序列,在oracle中就是一个对象,这个对象用来提供一个有序的数据列,这个有序的数据列的值都不重复. 1.序列可以自动生成唯一值 2.是一个可以被共享的对象 3.典型的用来生成主键值的一个 ...

  6. CSS学习心得2

    CSS样式 链接 a:link - 普通的.未被访问的链接 a:visited - 用户已访问的链接 a:hover - 鼠标指针位于链接的上方 a:active - 链接被点击的时刻 当为链接的不同 ...

  7. BW系统之间的InfoProvider数据传输:Export DataSource

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. AFNetworking的POST上传

    - (void)download { // 1.创建网络管理者 // AFHTTPSessionManager 基于NSURLSession AFHTTPSessionManager *manager ...

  9. JVM 新生代老年代

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  10. Ios二维码扫描(系统自带的二维码扫描)

    Ios二维码扫描 这里给大家介绍的时如何使用系统自带的二维码扫描方法和一些简单的动画! 操作步骤: 1).首先你需要搭建UI界面如图:下图我用了俩个imageview和一个label 2).你需要在你 ...