Java 找出一组给定数字的 n 个数字的所有组合

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23131039/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 20:56:32  来源:igfitidea点击:

Find all combinations of n numbers of a given set of numbers

javanumberssetcombinations

提问by a.s.p.

i want to write a app to find all possible combinations of n numbers of a given set of numbers and return a hashset of them.. for example if a give set{1,5,7,9} and size of set 2 then i will take:

我想编写一个应用程序来查找给定一组数字的 n 个数字的所有可能组合并返回它们的散列集。将采取:

[1, 5] [1, 7] [1, 9] [5, 7] [5, 9]

[1, 5] [1, 7] [1, 9] [5, 7] [5, 9]

i have the following code from this postbut i can't modified it for a given size of set every time.

我有这篇文章中的以下代码,但我不能每次都针对给定的集合大小修改它。

import java.util.ArrayList;
import java.util.Arrays;

class SumSet {
    static void sum_up_recursive(ArrayList<Integer> numbers,ArrayList<Integer> partial) {

       System.out.println("sum("+Arrays.toString(partial.toArray())+")=");

       for(int i=0;i<numbers.size();i++) 
       {
           ArrayList<Integer> remaining = new ArrayList<Integer>();
             int n = numbers.get(i);
             for (int j=i+1; j<numbers.size();j++) 
                 remaining.add(numbers.get(j));

             ArrayList<Integer> partial_rec = new ArrayList<Integer>(partial);
             partial_rec.add(n);
             sum_up_recursive(remaining,partial_rec);
       }
    }
    static void sum_up(ArrayList<Integer> numbers) {
        sum_up_recursive(numbers,new ArrayList<Integer>());
    }
    public static void main(String args[]) {
        Integer[] numbers = {1,5,7,9};
        sum_up(new ArrayList<Integer>(Arrays.asList(numbers)));
    }
}

回答by niiraj874u

We can add one more parameter sizeOfset in SumSet.sum_up_recursive(ArrayList<Integer>, ArrayList<Integer>, int)method like below. please run it tell me Does it give the output what you want ?

我们可以在SumSet.sum_up_recursive(ArrayList<Integer>, ArrayList<Integer>, int)下面的方法中再添加一个参数 sizeOfset 。请运行它告诉我它是否给出了你想要的输出?

import java.util.ArrayList;
import java.util.Arrays;

public class SumSet {
    static void sum_up_recursive(ArrayList<Integer> numbers,
            ArrayList<Integer> partial , int sizeOfset) {

        if(partial.size() == sizeOfset)
        {
            System.out.println("sum(" + Arrays.toString(partial.toArray()) + ")=");
        }

        for (int i = 0; i < numbers.size(); i++) {
            ArrayList<Integer> remaining = new ArrayList<Integer>();
            int n = numbers.get(i);
            for (int j = i + 1; j < numbers.size(); j++)
                remaining.add(numbers.get(j));

            ArrayList<Integer> partial_rec = new ArrayList<Integer>(partial);
            partial_rec.add(n);
            sum_up_recursive(remaining, partial_rec, sizeOfset);
        }
    }

    static void sum_up(ArrayList<Integer> numbers) {
        sum_up_recursive(numbers, new ArrayList<Integer>(), 2);
    }

    public static void main(String args[]) {
        Integer[] numbers = { 1, 5, 7, 9 };
        sum_up(new ArrayList<Integer>(Arrays.asList(numbers)));
    }
}

回答by juice

I changed recursive method from niiraj874u's answer to return a value. So now it gives list of hash sets as you wanted.

我从 niiraj874u 的答案中更改了递归方法以返回一个值。所以现在它可以根据需要提供哈希集列表。

static List<Set<Integer>> sum_up_recursive(List<Integer> numbers,
        Set<Integer> partial , int sizeOfset) {

    List<Set<Integer>> result = new ArrayList<Set<Integer>>();

    if(partial.size() == sizeOfset)
        result.add(partial);

    for (int i = 0; i < numbers.size(); i++) {
        ArrayList<Integer> remaining = new ArrayList<Integer>();
        int n = numbers.get(i);
        for (int j = i + 1; j < numbers.size(); j++)
            remaining.add(numbers.get(j));

        Set<Integer> partial_rec = new HashSet<Integer>(partial);
        partial_rec.add(n);
        result.addAll(sum_up_recursive(remaining, partial_rec, sizeOfset));
    }

    return result;
}

public static void main(String args[]) {
    Integer[] numbers = { 1, 5, 7, 9 };
    int size = 2;

    List<Set<Integer>> allCombinations = sum_up_recursive(Arrays.asList(numbers), new HashSet<Integer>(), size);

    for (Set<Integer> set : allCombinations) {
        for (Integer num : set)
            System.out.print(num + " ");
        System.out.println();
    }
}

回答by a.s.p.

thank you all... Also i found this solution

谢谢大家...我也找到了这个解决方案

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;

public class Comb {

    static HashSet combine(Integer[] arr, int k, int startId, int[] branch, int numElem,HashSet arrSet)
    {
        if (numElem == k)
        {
            //System.out.println("k: "+k+(Arrays.toString(branch)));
            ArrayList<Integer> mySet = new ArrayList<Integer>();
            for(int i=0;i<branch.length;i++)
            {
                mySet.add(branch[i]);
            }
            arrSet.add(mySet);
            return arrSet;
        }

        for (int i = startId; i < arr.length; ++i)
        {
            branch[numElem++]=arr[i];
            combine(arr, k, ++startId, branch, numElem, arrSet);
            --numElem;
        }
        return arrSet;
    }

    public static void main(String args[]) 
    {
        int k = 3;
        Integer[] input ={1,5,7,9}; "ABCD".toCharArray(); 
        int[] branch = new int[k];//{0,0};//new char[k];
        HashSet arrSet=new HashSet();
        arrSet=combine(input, k, 0, branch, 0, arrSet);
    }
}

回答by keerthikanth

package com.app.atb;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class Challenge {

    public static void main(String[] args) {

        Set<Integer> myset = new HashSet<Integer>();
        myset.add(1);
        myset.add(5);
        myset.add(7);
        myset.add(9);

        List<Set<Integer>> achieved = solveChallenge(myset);
        System.out.println(achieved);
    }

    public static List<Set<Integer>> solveChallenge(Set<Integer> myset) {

        int n = myset.size();
        Integer[] myInts = new Integer[n];
        Iterator<Integer> iterator = myset.iterator();
        int index = 0;
        while (iterator.hasNext()) {
            myInts[index] = iterator.next();
            ++index;
        }

        List<Set<Integer>> myList = new ArrayList<Set<Integer>>();
        Set<Integer> subSet;
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {

                if (j != i) {
                    subSet = new HashSet<Integer>();
                    subSet.add(myInts[i]);
                    subSet.add(myInts[j]);
                    myList.add(subSet);
                }

            }
        }
        return myList;
    }
}