001    package ps3.graph;
002    
003    /**
004     * A WeightedNode class is a simple record type which contains a name
005     * and a cost 
006     **/
007    
008    public class WeightedNode implements Comparable<WeightedNode> {
009        public final String name;
010        public final int cost;
011    
012        /**
013         * Constructs a new WeightedNode.
014         *
015         * @effects constructs a new WeightedNode with the name
016         * <code>name</code> and the cost <code>cost</code>.
017         *
018         **/
019        public WeightedNode(String name, int cost) {
020            this.name = name;
021            this.cost = cost;
022        }
023      
024        /**
025         * @return this.name
026         **/
027        public String name() {
028            return name;
029        }
030    
031        /**
032         * @return this.cost
033         **/
034        public int cost() {
035            return cost;
036        }
037    
038        public boolean equals(Object o) {
039            if (o instanceof WeightedNode) {
040                WeightedNode other = (WeightedNode) o;
041                return this.name.equals(other.name) &&
042                    (this.cost == other.cost);
043            }
044            return false;
045        }
046      
047        // Specified by the Object superclass
048        public int hashCode() {
049            return name.hashCode();
050        }
051    
052        // Specified by the Object superclass
053        public String toString() {
054            return "[" + name.toString() + ": " + cost + "]";
055        }
056    
057        /**
058         * WeightedNodes are ordered lexicographically by their name.  When
059         * two nodes share a name, their ordering is determined by the
060         * numeric ordering of their costs.
061         **/
062        public int compareTo(WeightedNode o) {
063            int c = name.compareTo(o.name());
064            if (c == 0) {
065                return cost - o.cost;
066            } else {
067                return c;
068            }
069        }
070        
071    }