GraphSolution.java

package edu.hawaii.ics.yucheng;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;

/**
 * A solution, or partial solution, for a graph. This class is immutable.
 */
final class GraphSolution implements Iterable<Edge> {
    public static final int   NO_ROOT   = -1;
    public static final float NO_WEIGHT = Float.MAX_VALUE;


    /**
     * Returns true if the edge is a duplicate in a collection.
     * 
     * @param edges The collection of edges.
     * 
     * @param edge The edge to find.
     * 
     * @return True indicates the edge is a duplicate.
     */
    private static boolean isDuplicateEdge(final Collection<Edge> edges,
        final Edge edge) {

        for (final Edge e : edges)
            if (edge.compareTo(e) == 0)
                return true;

        return false;
    }

    private final ArrayList<Edge> myEdges;
    private final int             myRoot;
    private final float           myWeight;


    /**
     * Initializes a new instance of the class.
     * 
     * @param edges The edges.
     */
    public GraphSolution(final Collection<Edge> edges) {
        this(edges, NO_ROOT);
    }


    /**
     * Initializes a new instance of the class.
     * 
     * @param edges The edges.
     * 
     * @param root The root edge.
     */
    public GraphSolution(final Collection<Edge> edges, final int root) {
        this(edges, root, NO_WEIGHT);
    }


    /**
     * Initializes a new instance of the class.
     * 
     * @param edges The edges.
     * 
     * @param root The root edge.
     * 
     * @param weight The calculated weight.
     */
    public GraphSolution(final Collection<Edge> edges, final int root,
        final float weight) {

        if (edges == null)
            throw new NullPointerException("edges");

        myEdges = new ArrayList<Edge>();
        for (final Edge e : edges) {
            if (e == null)
                throw new GraphException("Null edge detected");
            if (isDuplicateEdge(myEdges, e))
                throw new GraphException("Duplicate edge detected");
            myEdges.add(e);
        }

        if (root != NO_ROOT) {
            if (root > myEdges.size())
                throw new GraphException("Root index too large");
            if (root < 0)
                throw new GraphException("Root index too small");
        }
        myRoot = root;

        myWeight = weight;

        Collections.sort(myEdges);
    }


    /**
     * Returns true if the solution has a root specified.
     * 
     * @return True if the solution has a root specified and false otherwise.
     */
    public boolean hasRoot() {
        return myRoot != NO_ROOT;
    }


    /**
     * Returns true if the solution has a weight specified.
     * 
     * @return True if the solution has a weight specified and false otherwise.
     */
    public boolean hasWeight() {
        return myWeight != NO_WEIGHT;
    }


    /**
     * Returns an iterator for the edges in the solution.
     * 
     * @return An edge iterator.
     */
    public Iterator<Edge> iterator() {
        return myEdges.iterator();
    }


    /**
     * Returns the root vertex.
     * 
     * @return The root vertex.
     */
    public int root() {
        if (!hasRoot())
            throw new GraphException("No root available.");
        return myRoot;
    }


    /**
     * Returns the calculated weight.
     * 
     * @return The calculated weight.
     */
    public float weight() {
        if (!hasWeight())
            throw new GraphException("No weight available.");
        return myWeight;
    }
}
Valid HTML 4.01 Valid CSS