package org.andengine.util.adt.trie; import android.util.SparseArray; /** * (c) Zynga 2012 * * @author Nicolas Gramlich <ngramlich@zynga.com> * @since 12:25:47 - 30.01.2012 */ public class Trie implements ITrie { // =========================================================== // Constants // =========================================================== private static final int CHILDREN_SIZE_DEFAULT = 'Z' - 'A' + 1; // =========================================================== // Fields // =========================================================== private final TrieNode mRoot = new TrieNode(); // =========================================================== // Constructors // =========================================================== // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override public void add(final CharSequence pCharSequence) { this.mRoot.add(pCharSequence); } @Override public void add(final CharSequence pCharSequence, final int pStart, final int pEnd) { this.mRoot.add(pCharSequence, pStart, pEnd); } @Override public boolean contains(final CharSequence pCharSequence) { return this.mRoot.contains(pCharSequence); } @Override public boolean contains(final CharSequence pCharSequence, final int pStart, final int pEnd) { return this.mRoot.contains(pCharSequence, pStart, pEnd); } // =========================================================== // Methods // =========================================================== // =========================================================== // Inner and Anonymous Classes // =========================================================== public static class TrieNode implements ITrie { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== private SparseArray<TrieNode> mChildren; private boolean mWordEndFlag; // =========================================================== // Constructors // =========================================================== public TrieNode() { this(false); } public TrieNode(final boolean pWordEndFlag) { this.mWordEndFlag = pWordEndFlag; } // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== @Override public void add(final CharSequence pCharSequence) { final int length = pCharSequence.length(); if(length == 0) { return; } this.add(pCharSequence, 0, length); } @Override public void add(final CharSequence pCharSequence, final int pStart, final int pEnd) { if(this.mChildren == null) { this.mChildren = new SparseArray<Trie.TrieNode>(Trie.CHILDREN_SIZE_DEFAULT); } final char character = pCharSequence.charAt(pStart); TrieNode child = this.mChildren.get(character); if(child == null) { child = new TrieNode(); this.mChildren.put(character, child); } if(pStart < pEnd - 1) { child.add(pCharSequence, pStart + 1, pEnd); } else { child.mWordEndFlag = true; } } @Override public boolean contains(final CharSequence pCharSequence) { final int length = pCharSequence.length(); if(length == 0) { throw new IllegalArgumentException(); } return this.contains(pCharSequence, 0, length); } @Override public boolean contains(final CharSequence pCharSequence, final int pStart, final int pEnd) { if(this.mChildren == null) { return false; } final char character = pCharSequence.charAt(pStart); final TrieNode child = this.mChildren.get(character); if(child == null) { return false; } else { if(pStart < pEnd - 1) { return child.contains(pCharSequence, pStart + 1, pEnd); } else { return child.mWordEndFlag; } } } // =========================================================== // Inner and Anonymous Classes // =========================================================== } }