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 }