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();
        }
    }
时间: 2024-12-27 23:58:41

JAVA求集合中的组合的相关文章

java按照集合中元素的属性进行排序示例代码

public class Student { private String name; private int age; private int id; public Student() {  super(); } public Student(String name, int age, int id) {  super();  this.name = name;  this.age = age;  this.id = id; } public String getName() {  retur

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

前段时间接触的这个题目,大体理解了,还有些小地方仍待进一步品味,暂且记下. import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /* * 查找字符串中出现频率最高的字符 * * 主要思路:先将字符

黑马程序员——java——TreeSet集合中储存学生对象,按照其年龄进行排序

TreeSet集合中储存学生对象,按照其年龄进行排序 import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.TreeSet; public class SortListDemos { public static void main(String[] args) { // //linkhash

Java Collection集合中的iterator方法

Iterator接口的概述 /** * java.util.Iterator接口:选代器(对集合进行遍历) * 有两个常用的方法 * boolean hasNext() * 如果仍有元素可以迭代,则返回true. * 即判断集合中还有没有下ー个元素,有就返回true,没有就返回 false * E next() * 返回送代的下一个元素. * 即取出集合中的下一个元素 * iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象. * 获取实现类的方式比较特

集合中的类型转化 以及求集合中元素的最大值,平均值

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace 集合的小练习 { class Program { static void Main(string[] args) { //创建一个集合,里面添加一些数字,求平均值以及和,最大值. ArrayLis

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 { public static List<Set<Object>> Query(Set<Object> t

Java 之 集合中的 modCount的作用

modCount:记录当前集合被修改的次数 在所有的集合实现类中(Collection与Map中),都会有一个 modCount 的变量出现,它的作用就是记录当前集合被修改的次数. 下面以ArrayList 类进行说明: 添加方法: 删除方法: 可以看出,两个操作都会影响元素的个数. 当我们使用迭代器或 foreach 遍历时,如果你在 foreach 遍历时,自动调用迭代器的迭代方法,此时在遍历过程中调用了集合的add,remove方法时,modCount就会改变,而迭代器记录的modCoun

java求字符串中连续的数字为一个整体并返会连续的数字和共有多少个整数

public static void main(String[] args) { String strNumbers = "0123456789";//用来进行判断数字的 System.out.println("请输入一个字符串:"); String string = new Scanner(System.in).next(); //自定义输入 String[] strings = new String[string.length()];//自定义是字符串 Syst

Java List集合中元素比较大小

list排序方法一Comparator形式: 1.比较数字 List<Shoes> all_shoes = new ArrayList<Shoes>(); Collections.sort(all_shoes, new Comparator<Shoes>(){ @Override /* * * int compare(String o1, String o2) 返回一个基本类型的整型 * 返回-1表示:shoes1.getSimilarity()大于等于shoes2.g