package org.maltparser.core.symbol.trie; import org.maltparser.core.symbol.SymbolException; /** * * @author Johan Hall * @since 1.0 * */ public class Trie { private final TrieNode root; private final StringBuilder sb; public Trie() { root = new TrieNode(' ', null); sb = new StringBuilder(); } public TrieNode addValue(String value, TrieSymbolTable table, int code) throws SymbolException { TrieNode node = root; final char[] chars = value.toCharArray(); for (int i = chars.length - 1; i >= 0; i--) { if (i == 0) { node = node.getOrAddChild(true, chars[i], table, code); } else { node = node.getOrAddChild(false, chars[i], table, code); } } return node; } public TrieNode addValue(StringBuilder symbol, TrieSymbolTable table, int code) throws SymbolException { TrieNode node = root; for (int i = symbol.length() - 1; i >= 0; i--) { if (i == 0) { node = node.getOrAddChild(true, symbol.charAt(i), table, code); } else { node = node.getOrAddChild(false, symbol.charAt(i), table, code); } } return node; } public String getValue(TrieNode node, TrieSymbolTable table) { sb.setLength(0); TrieNode tmp = node; while (tmp != root) { // && tmp != null) { sb.append(tmp.getCharacter()); tmp = tmp.getParent(); } return sb.toString(); } public Integer getEntry(String value, TrieSymbolTable table) { TrieNode node = root; final char[] chars = value.toCharArray(); int i = chars.length - 1; for (; i >= 0 && node != null; i--) { node = node.getChild(chars[i]); } if (i < 0 && node != null) { return node.getEntry(table); } return null; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } return ((root == null) ? ((Trie) obj).root == null : root.equals(((Trie) obj).root)); } @Override public int hashCode() { return 31 * 7 + (null == root ? 0 : root.hashCode()); } }