package de.ugoe.cs.eventbench.ppm; import java.util.LinkedList; import java.util.List; public class Trie { private List> children = new LinkedList>(); public void add(List subsequence) { if( !subsequence.isEmpty() ) { subsequence = new LinkedList(subsequence); // copy list! T firstSymbol = subsequence.get(0); getChildCreate(firstSymbol).add(subsequence); } } // FIXME clones of TrieNode.getChildCreate protected TrieNode getChildCreate(T symbol) { TrieNode node = getChild(symbol); if( node==null ) { node = new TrieNode(symbol); children.add(node); } return node; } // FIXME clones of TrieNode.getChild protected TrieNode getChild(T symbol) { for( TrieNode child : children ) { if( child.getSymbol().equals(symbol) ) { return child; } } return null; } public int getCount(List sequence) { int count = 0; TrieNode node = find(sequence); if( node!=null ) { count = node.getCount(); } return count; } public int getCount(List sequence, T follower) { List tmpSequence = new LinkedList(sequence); tmpSequence.add(follower); return getCount(tmpSequence); } public TrieNode find(List sequence) { TrieNode result = null; if( !sequence.isEmpty() ) { TrieNode node = getChild(sequence.get(0)); if( node!=null ) { result = node.find(sequence); } } return result; } public List getFollowingSymbols(List sequence) { List result = null; TrieNode node = find(sequence); if( node!=null ) { result = node.getFollowingSymbols(); } return result; } public List getContextSuffix(List context) { List contextSuffix = new LinkedList(context); boolean suffixFound = false; while(!suffixFound) { if( contextSuffix.isEmpty() ) { suffixFound = true; // suffix is the empty word } else { TrieNode node = find(contextSuffix); if( node!=null ) { if( !node.getFollowingSymbols().isEmpty() ) { suffixFound = true; } } contextSuffix.remove(0); } } return contextSuffix; } @Override public String toString() { return children.toString(); } }