1. 程式人生 > >生成非空集合--逐步生成結果_迭代

生成非空集合--逐步生成結果_迭代

1.問題描述:

 請編寫一個方法,返回某集合的所有非空子集。
 給定一個int陣列A和陣列的大小int n,請返回A的所有非空子集。
 保證A的元素個數小於等於20,且元素互異

2.除了使用遞迴的方法還可以使用迭代的方法來解決,先建立儲存集合的資料結構Set<Set<Integer>set並且進行初始化把第一個元素初始化為空集,然後通過for迴圈遍歷這個集合,然後在for中建立一個新的Set<Set<Integer> setNew用來儲存原來已經存在的集合,for迴圈遍歷的是原來就已經存在的集合set , 然後往當前原來的集合添加當前元素,然後把它新增到setNew集合裡面,然後把當前最新的元素集合賦值給set,方便下一次進行遍歷新增元素(在for迴圈中新建一個setNew中是為了輔助作用因為不可能邊遍歷邊向集合中新增元素的)

其中使用到了一個集合加入多個集合,所以要使用Set的addAll方法

3.具體的程式碼如下:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main{
    public static void main(String[] args) {
        Scanner sc  = new Scanner(System.in);
        int n = sc.nextInt();
        int A[] = new int[n];
        for(int i = 0; i < n; i++){
            A[i] = sc.nextInt();
        }
        Set<Set<Integer>> set = solve(A, n);
        for(Set<Integer> set1 : set){
            if(set1.size() == 0){
                set.remove(set1);
                break;
            }
        }
        System.out.println(set);
    }

    private static Set<Set<Integer>> solve(int[] A, int n) {
        Set<Set<Integer>> set = new HashSet<>();

        //初始化為空集
        set.add(new HashSet<>());
        for(int i = 0; i < n; i++){

            //新建一個大集合
            Set<Set<Integer>> setNew = new HashSet<>();

           // 一個集合巢狀多個集合, 所以要使用Set的addAll方法(把原來存在的多個子集合加進去)
            setNew.addAll(set);
            for(Set<Integer> setHelp : set){

                //遍歷之前的集合全部複製一遍,不能夠加到set因為正在遍歷著set
                Set<Integer> clone = (Set)((HashSet)(setHelp)).clone();

                //把當前元素加進去
                clone.add(A[i]);

                //把克隆的集合加入到大集合中
                setNew.add(clone);
            }
            set = setNew;
        }
        return set;
    }
}