Skip to content
Snippets Groups Projects
SubsetUtil.java 2.16 KiB
Newer Older
package de.unipotsdam.cs.toolup.util;

import java.util.*;

/**
 * Created by Thiemo on 20.12.2015.
 */
public class SubsetUtil {
    public static <T> Set<Set<T>> getAllSubsetsOfSize(Set<T> superSet, int size) {
        List<T> superList = new ArrayList<>(superSet);
        Set<Set<T>> setOfSubSets = new HashSet<>();

        for (int i = 0; i < superList.size(); i++) {
            T currentElement = superList.get(i);

            if (size == 1) {
                List<T> newSubList = Arrays.asList(currentElement);
                setOfSubSets.add(new HashSet<>(newSubList));
            } else {
                setOfSubSets.addAll(createAllSubSetsWithCurrentElementRecursively(size, superList, currentElement));
            }
        }

        return setOfSubSets;
    }

    /**
     * Recursive method.
     * <p>
     * Example:
     * If current element is "1" and superList is "1","2","3","4" and we are looking for sub sets of size 2;
     * <p>
     * - The method gets all sub sets of size 1 of the list "2","3","4", which are the sub sets {"2"}, {"3"} and {"4"}
     * - Then the method adds the current element to each of these sub sets, which results
     * in the sets {"1","2"},{"1","3"} and {"1","4"}
     * - The method returns a set of all these created sub sets
     */
    private static <T> Set<Set<T>> createAllSubSetsWithCurrentElementRecursively(int size, List<T> superList, T currentElement) {
        Set<Set<T>> setOfSubSetsWithoutCurrentElement = getAllSmallerSubsetsWithoutCurrentElement(size, superList, currentElement);
        Set<Set<T>> resultSetOfSubSets = new HashSet<>();

        for (Set<T> subSetWithoutCurrentElement : setOfSubSetsWithoutCurrentElement) {
            subSetWithoutCurrentElement.add(currentElement);
            resultSetOfSubSets.add(subSetWithoutCurrentElement);
        }

        return resultSetOfSubSets;
    }

    private static <T> Set<Set<T>> getAllSmallerSubsetsWithoutCurrentElement(int size, List<T> superList, T currentElement) {
        Set<T> setWithoutCurrentElement = new HashSet(superList);
        setWithoutCurrentElement.remove(currentElement);
        return getAllSubsetsOfSize(setWithoutCurrentElement, size - 1);
    }


}