All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.jas.util.PowerSet Maven / Gradle / Ivy

The newest version!
/*
 * $Id: PowerSet.java 4052 2012-07-25 19:20:25Z kredel $
 */

package edu.jas.util;


import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;


/**
 * Power set with iterator.
 * @author Heinz Kredel
 */
public class PowerSet implements Iterable> {


    /**
     * data structure.
     */
    public final List set; // Iterable also ok


    /**
     * PowerSet constructor.
     * @param set generating set.
     */
    public PowerSet(List set) {
        this.set = set;
    }


    /**
     * get an iterator over subsets.
     * @return an iterator.
     */
    public Iterator> iterator() {
        return new PowerSetIterator(set);
    }

}


/**
 * Power set iterator.
 * @author Heinz Kredel
 */
class PowerSetIterator implements Iterator> {


    /**
     * data structure.
     */
    public final List set;


    final List rest;


    final E current;


    private PowerSetIterator recIter;


    enum Mode {
        copy, extend, first, done
    };


    Mode mode;


    /**
     * PowerSetIterator constructor.
     * @param set generating set.
     */
    public PowerSetIterator(List set) {
        this.set = set;
        if (set == null || set.size() == 0) {
            current = null;
            recIter = null;
            rest = null;
            mode = Mode.first;
            return;
        }
        mode = Mode.copy;
        current = this.set.get(0);
        rest = new LinkedList(this.set);
        rest.remove(0);
        recIter = new PowerSetIterator(rest);
    }


    /**
     * Test for availability of a next subset.
     * @return true if the iteration has more subsets, else false.
     */
    public boolean hasNext() {
        if (mode == Mode.first) {
            return true;
        }
        if (recIter == null) {
            return false;
        }
        return recIter.hasNext() || mode == Mode.copy;
    }


    /**
     * Get next subset.
     * @return next subset.
     */
    public List next() {
        if (mode == Mode.first) {
            mode = Mode.done;
            List first = new LinkedList();
            return first;
        }
        if (mode == Mode.extend) {
            if (recIter.hasNext()) {
                List next = new LinkedList(recIter.next());
                next.add(current);
                return next;
            }
        }
        if (mode == Mode.copy) {
            if (recIter.hasNext()) {
                return recIter.next();
            }
            mode = Mode.extend;
            recIter = new PowerSetIterator(rest);
            return this.next();
        }
        return null;
    }


    /**
     * Remove the last subset returned from underlying set if allowed.
     */
    public void remove() {
        throw new UnsupportedOperationException("cannnot remove subsets");
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy