001    package org.maltparser.parser.transition;
002    
003    
004    /**
005     * Transition contains one individual transition. For example, Nivre arc-eager algorithms have the unlabeled 
006     * transition <code>SH</code>, <code>RE</code> and the labeled transition<code>RA</code>, <code>LA</code>. These
007     * transition will be four individual transition.
008     * 
009     * @author Joakim Nivre
010     * @author Johan Hall
011     * @since 1.0
012    */
013    public class Transition implements Comparable<Transition> {
014            /**
015             * Transition code
016             */
017            private int code;
018            /**
019             * Transition symbol
020             */
021            private String symbol;
022            /**
023             * <code>true</code> if the transition is labeled, otherwise <code>false</code>
024             */
025            private boolean labeled;
026            private int cachedHash;
027            /**
028             * Creates a transition 
029             * 
030             * @param code  Transition code
031             * @param symbol        Transition name
032             * @param labeled       <code>true</code> if the transition is labeled, otherwise <code>false</code>
033             */
034            public Transition(int code, String symbol, boolean labeled) {
035                    this.code = code;
036                    this.symbol = symbol;
037                    this.labeled = labeled;
038            }
039    
040            /**
041             * Returns the transition code
042             * 
043             * @return the transition code
044             */
045            public int getCode() {
046                    return code;
047            }
048            
049            /**
050             * Returns the transition symbol
051             * 
052             * @return      the transition symbol
053             */
054            public String getSymbol() {
055                    return symbol;
056            }
057            
058            /**
059             * Returns true if the transition is labeled, otherwise false
060             * 
061             * @return <code>true</code> if the transition is labeled, otherwise <code>false</code>
062             */
063            public boolean isLabeled() {
064                    return labeled;
065            }
066    
067            
068            public int compareTo(Transition that) {
069                    final int BEFORE = -1;
070                final int EQUAL = 0;
071                final int AFTER = 1;
072    //          if ( this == that ) return EQUAL;
073                if (this.code < that.code) return BEFORE;
074                if (this.code > that.code) return AFTER;
075                return EQUAL;
076            }
077    
078            public boolean equals(Object obj) {
079                    if (this == obj)
080                            return true;
081                    if (obj == null)
082                            return false;
083                    if (getClass() != obj.getClass())
084                            return false;
085                    Transition t = (Transition)obj;
086                    return (code == t.code && symbol.equals(t.symbol) && labeled == t.isLabeled());
087            }
088            
089            public int hashCode() {
090                    if (cachedHash == 0) {
091                            int hash = 31*7 + code;
092                            hash = 31*hash + (null == symbol ? 0 : symbol.hashCode());
093                            hash = 31*hash +  (labeled ? 1 : 0);
094                            cachedHash = hash;
095                    }
096                    return cachedHash;
097            }
098            
099            
100            /* (non-Javadoc)
101             * @see java.lang.Object#toString()
102             */
103            public String toString() {
104                    return symbol + " [" + code +"] " + labeled;
105            }
106    }