package org.jbehave.eclipse.util; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class CharTree<T> { private Map<Integer, CharTree<T>> children = new HashMap<Integer, CharTree<T>>(); private final int key; private T value; public CharTree(int key) { this(key, null); } public CharTree(int key, T value) { this.key = key; this.value = value; } public T lookup(CharSequence sequence) { CharTree<T> tree = this; T found = this.value; for (int i = 0, n = sequence.length(); i < n; i++) { tree = tree.get(sequence.charAt(i)); if (tree == null) { break; } if (tree.value != null) { found = tree.value; } } return found; } public void print(int level) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < level; i++) { builder.append(" | "); } System.out.print(builder.toString()); System.out.print("["); System.out.print((char) key); System.out.print("] "); System.out.println(value == null ? "n/a" : value); List<Integer> keys = new ArrayList<Integer>(children.keySet()); Collections.sort(keys); for (Integer key : keys) { children.get(key).print(level + 1); } } public void push(CharSequence seq, T value) { push(seq, 0, value); } private void push(CharSequence sequence, int position, T value) { if (position < sequence.length()) { int c = sequence.charAt(position); CharTree<T> child = getOrCreate(c); child.push(sequence, position + 1, value); } else { this.value = value; } } private CharTree<T> get(int c) { return children.get(c); } private CharTree<T> getOrCreate(int c) { CharTree<T> tree = children.get(c); if (tree == null) { tree = new CharTree<T>(c); children.put(c, tree); } return tree; } public boolean isLeaf() { return children.isEmpty(); } }