Link to home
Start Free TrialLog in
Avatar of kimia_az
kimia_azFlag for Canada

asked on

Create a powerset in Java

Hi,

 In Java I want to create a powerset, when i give  a set and a number for the size for e.g.

{1,2,3,4} set:3
------------------
{1,2,3}
{1,2,4}
{1,3,4}
{2,3,4}

or
{1,2,3} set 2
{1,2}
{1,3}
{2,3}

thanks
ASKER CERTIFIED SOLUTION
Avatar of for_yan
for_yan
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
This implementation is for all sets, I guess it is easy to modify only limiting to
certain size
Avatar of Mick Barry
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial

This will print only sets of 3 out of {1,2,3,4}  a little bit nicer:


import java.util.*;

public class SetUtils {
    public static <T> Set<Set<T>> powerSet(Set<T> originalSet) {
        Set<Set<T>> sets = new HashSet<Set<T>>();
        if (originalSet.isEmpty()) {
            sets.add(new HashSet<T>());
            return sets;
        }
        List<T> list = new ArrayList<T>(originalSet);
        T head = list.get(0);
        Set<T> rest = new HashSet<T>(list.subList(1, list.size()));
        for (Set<T> set : powerSet(rest)) {
            Set<T> newSet = new HashSet<T>();
            newSet.add(head);
            newSet.addAll(set);
            sets.add(newSet);
         
            sets.add(set);
        }


        return sets;
    }


        public static <T> Set<Set<T>> powerSet1( Set<T>mySet, int n){
                  Set<Set<T>> sets1 = new  HashSet<Set<T>>();
           Set originalSet =  SetUtils.powerSet(mySet);
            Iterator it = originalSet.iterator();
            while(it.hasNext()) {
                Set s = (Set) it.next();
                if(s.size() == n)sets1.add(s);
            }


            return sets1;
        }


    public static void main(String[] args){
    Set<Integer> mySet = new HashSet <Integer>();
    mySet.add(1);
    mySet.add(2);
    mySet.add(3);
     mySet.add(4);    
    for (Set <Integer> s : SetUtils.powerSet1(mySet, 3)) {
               System.out.println(s);
    }

    
}
}

Open in new window

int setLength = 3;
		int[] array = new int[]{1,2,3,4};
		for(int i=0;i<array.length-2;i++)
		{			
			for(int j=i+1;j<array.length -1;j++)
			{
				for(int k=j+1;k<array.length;k++)
				{
					int[] temp = new int[setLength];
					temp[0] = array[i];
					temp[1] = array[j];
					temp[2] = array[k];
					
					System.out.println(temp[0]+","+temp[1]+","+temp[2]);
				}
			}
		}

Open in new window