lucene-multilingual

Multilingual enhancements for the Lucene text search library
git clone https://code.djc.id.au/git/lucene-multilingual/

src/main/java/au/com/miskinhill/search/analysis/Trie.java (1558B) - raw

      1 package au.com.miskinhill.search.analysis;
      2 
      3 import java.util.HashMap;
      4 import java.util.Map;
      5 
      6 // TODO move this into its own/a common utilities module?
      7 public class Trie<T> {
      8 	
      9 	private TrieNode root;
     10 
     11 	/**
     12 	 * Creates a new trie with the given value associated with the empty string
     13 	 * (i.e. it will be returned by default, if no longer matching prefix is
     14 	 * found).
     15 	 */
     16 	public Trie(T rootValue) {
     17 		root = new TrieNode(rootValue);
     18 	}
     19 	
     20 	/**
     21 	 * Associates the given value with the given key.
     22 	 */
     23 	public void put(CharSequence key, T value) {
     24 		if (value == null)
     25 			throw new IllegalArgumentException("null values cannot be stored");
     26 		int i = 0;
     27 		TrieNode curr = root;
     28 		while (i < key.length()) {
     29 			TrieNode child = curr.children.get(key.charAt(i));
     30 			if (child == null) {
     31 				TrieNode new_ = new TrieNode(null);
     32 				curr.children.put(key.charAt(i), new_);
     33 				curr = new_;
     34 			} else {
     35 				curr = child; 
     36 			}
     37 			i ++;
     38 		}
     39 		curr.value = value;			
     40 	}
     41 
     42 	/**
     43 	 * Returns the value associated with the longest prefix match for the given
     44 	 * key.
     45 	 */
     46 	public T get(CharSequence key) {
     47 		int i = 0;
     48 		TrieNode curr = root;
     49 		T retval = root.value;
     50 		while (i < key.length()) {
     51 			curr = curr.children.get(key.charAt(i));
     52 			if (curr == null) {
     53 				return retval;
     54 			} else if (curr.value != null) {
     55 				retval = curr.value;
     56 			}
     57 			i ++;
     58 		}
     59 		return retval;
     60 	}
     61 	
     62 	private class TrieNode {
     63 		public T value;
     64 		public Map<Character, TrieNode> children = new HashMap<Character, TrieNode>();
     65 		public TrieNode(T value) {
     66 			this.value = value;
     67 		}
     68 	}
     69 
     70 }