好几个月没弄代码了,今天弄个求组合的DEMO

思路是将集合的每个值对照一个索引,索引大小是集合的大小+2.索引默认为[000...000],当组合后选取的组合值demo为[0100..00]。然后根据遍历索引来到集合中取值。

上代码:

  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;
  4.  
  5. public class ComBit {
  6.  
  7. public static void main(String[] args) {
  8. // Integer test
  9. int[] combination = new int[] { 1, 2, 3, 4 };
  10. List<Integer> combinationlist = new ArrayList<Integer>();
  11. for (Integer integer : combination) {
  12. combinationlist.add(integer);
  13. }
  14. ComBitIterator<Integer> i = new ComBitIterator<Integer>(combinationlist);
  15. while (i.hasNext()) {
  16. Object obj = i.next();
  17. System.out.println(obj.toString());
  18. }
  19. // String test
  20. String[] str = new String[] { "apple", "orange", "tomato", "potato" };
  21. List<String> combinationSlist = new ArrayList<String>();
  22. for (String s : str) {
  23. combinationSlist.add(s);
  24. }
  25. ComBitIterator<String> ii = new ComBitIterator<String>(combinationSlist);
  26. while (ii.hasNext()) {
  27. Object obj = ii.next();
  28. System.out.println(obj.toString());
  29. }
  30.  
  31. }
  32.  
  33. }
  34.  
  35. class ComBitIterator<T> implements Iterator<T> {
  36.  
  37. private int[] _bitArray = null;
  38.  
  39. protected final int _length;
  40.  
  41. protected final List<T> combination;
  42.  
  43. protected List<T> _currentSet;
  44.  
  45. public ComBitIterator(List<T> combination) {
  46. _currentSet = new ArrayList<T>();
  47. this._length = combination.size();
  48. this._bitArray = new int[_length + 2];
  49. this.combination = combination;
  50. }
  51.  
  52. @Override
  53. public boolean hasNext() {
  54. return _bitArray[_length + 1] != 1;
  55. }
  56.  
  57. @SuppressWarnings("unchecked")
  58. @Override
  59. public T next() {
  60. _currentSet.clear();
  61. for (int index = 1; index <= _length; index++) {
  62. if (_bitArray[index] == 1) {
  63. T value = combination.get(index - 1);
  64. _currentSet.add(value);
  65. }
  66. }
  67. int i = 1;
  68. while (_bitArray[i] == 1) {
  69. _bitArray[i] = 0;
  70. i++;
  71. }
  72. _bitArray[i] = 1;
  73. return (T) _currentSet;
  74. }
  75.  
  76. }

------------------------------------------------分割线---------------------------------------------------------

PS:代码源于要求求数字1-20中 任取N的组合后合值为36,于是思路想到两种,第一种是递归,第二种虽然也是递归,但是想弄个通用的,就有了以上的代码。另外群里有人写出了直接递归的代码,也附上:

  1. public static void main(String[] args) {
  2. combinateDataOfRange(1, 20, 36);
  3. }
  4.  
  5. public static void combinateDataOfRange(int min, int max, int target) {
  6. combinateData(0, min, max, target, new Stack<Integer>());
  7. }
  8.  
  9. public static void combinateData(int sum, int min, int max, int target,
  10. Stack<Integer> stack) {
  11. for (int i = stack.isEmpty() ? min : (Integer) stack.lastElement() + 1; i < max; ++i) {
  12. int tempSum = sum + i;
  13. stack.push(i);
  14. if (tempSum == target) {
  15. System.out.println(stack + "=" + target);
  16. } else {
  17. combinateData(tempSum, min, max, target, stack);
  18. }
  19. stack.pop();
  20. }
  21. }

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. mysql优化一 之 优化内容概述及开启慢查日志的相关配置

    1-1数据库优化的目的 首先是为了避免出现页面访问错误(基本有三种) (1)由于数据库连接timeout产生的页面5XX错误 (2)由于慢查询造成页面无法加载 (3)由于阻塞造成的数据无法提交 其次: ...

  2. libevent源码分析:http-server例子

    http-server例子是libevent提供的一个简单web服务器,实现了对静态网页的处理功能. /* * gcc -g -o http-server http-server.c -levent ...

  3. SQL Server 取日期时间部分

    在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate() 用DateName()就可以获得相应的年.月.日,然后再把它们连接起来就可以了: ...

  4. mysql connection refused

    mysql数据库认证的时候和别的服务器不一样,即使mysqld数据库服务器没有启动,使用mysql这种客户端程序去连接,也要先输入密码,从而使人有一种错觉,以会服务器已经正常启动了.是不是密码或是主机 ...

  5. 通过sharedpreferences实现记住密码功能

    通过sharedpreferences实现记住密码功能

  6. Java GUI编程-(项目代码_扫雷_弹钢琴)

    --扫雷 package com;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionLis ...

  7. 基于Web的制造追溯系统DEMO

    写在前面 本文不贴任何代码,以图片为主,也许图片更直观,请各位园友谅解! 很久没有写过博客了,这是2016年的第一篇文章:最近主要是忙着完成公司的一个新项目,逛园子的时间都明显少了,只有下班回到家睡觉 ...

  8. Linux命令:screen

    ①杀死detached状态的会话: $ screen -X -S [session # you want to kill] quit

  9. Cocos2d-x 核心概念 - 坐标系(UI.OpenGL.世界坐标系.模型坐标系)

    UI坐标系与OpenGL坐标系 UI坐标就是Android和IOS等应用开发时候使用的二维坐标系,原点在左上角 OpenGL坐标是三维坐标,由于Cocos2d-x Lua 底层采用OpenGL渲染,因 ...

  10. js基础:函数表达式和函数声明

    函数表达式和函数声明的区别.实际上,解析器在向执行环境中加载数据是,对函数表达式和函数声明并非一视同仁.解析器会率先读取函数声明,并使其在执行任何代码之前可用.而函数表达式,则必须等到解析器执行到它所 ...