source: trunk/EventBenchCore/src/de/ugoe/cs/eventbench/ppm/TrieNode.java @ 5

Last change on this file since 5 was 5, checked in by sherbold, 13 years ago
  • major debugging of PPM and Trie. Results are now correct, but both classes need major refactorings
File size: 2.6 KB
Line 
1package de.ugoe.cs.eventbench.ppm;
2
3import java.security.InvalidParameterException;
4import java.util.LinkedList;
5import java.util.List;
6
7import de.ugoe.cs.eventbench.ppm.Trie.Edge;
8import de.ugoe.cs.eventbench.ppm.Trie.TrieVertex;
9import de.ugoe.cs.util.StringTools;
10import edu.uci.ics.jung.graph.DelegateTree;
11
12
13class TrieNode<T> {
14       
15        private int count;
16        private final T symbol;
17       
18        private List<TrieNode<T>> children;
19       
20        public TrieNode(T symbol) {
21                if( symbol==null ) {
22                        throw new InvalidParameterException("symbol must not be null.");
23                }
24                this.symbol = symbol;
25                count = 0;
26                children = new LinkedList<TrieNode<T>>();
27        }
28
29        public void add(List<T> subsequence) {
30                if( !subsequence.isEmpty() ) {
31                        if( !symbol.equals(subsequence.get(0)) ) { // should be guaranteed by the recursion/TrieRoot!
32                                throw new AssertionError("Invalid trie operation!");
33                        }
34                        count++;
35                        subsequence.remove(0);
36                        if( !subsequence.isEmpty() ) {
37                                T nextSymbol = subsequence.get(0);
38                                getChildCreate(nextSymbol).add(subsequence);
39                        }
40                }
41        }
42       
43        public T getSymbol() {
44                return symbol;
45        }
46       
47        public int getCount() {
48                return count;
49        }
50       
51        protected TrieNode<T>  getChildCreate(T symbol) {
52                TrieNode<T> node = getChild(symbol);
53                if( node==null ) {
54                        node = new TrieNode<T>(symbol);
55                        children.add(node);
56                }
57                return node;
58        }
59       
60        protected TrieNode<T> getChild(T symbol) {
61                for( TrieNode<T> child : children ) {
62                        if( child.getSymbol().equals(symbol) ) {
63                                return child;
64                        }
65                }
66                return null;
67        }
68       
69
70       
71        public TrieNode<T> find(List<T> subsequence) {
72                TrieNode<T> result = null;
73                if( subsequence.isEmpty() ) {
74                        result = this;
75                } else {
76                        TrieNode<T> node = getChild(subsequence.get(0));
77                        if( node!=null ) {
78                                subsequence.remove(0);
79                                result = node.find(subsequence);
80                        }
81                }
82                return result;
83        }
84       
85        // returns all symbols that follow this node
86        public List<T> getFollowingSymbols() {
87                List<T> followingSymbols = new LinkedList<T>();
88                for( TrieNode<T> child : children ) {
89                        followingSymbols.add(child.getSymbol());
90                }
91                return followingSymbols;
92        }
93       
94        @Override
95        public String toString() {
96                String str = symbol.toString()+" #"+count;
97                if( !children.isEmpty() ) {
98                        str += StringTools.ENDLINE + children.toString();
99                }
100                return str;
101        }
102
103        public void getGraph(TrieVertex parent, DelegateTree<TrieVertex, Edge> graph) {
104                TrieVertex vertex = new TrieVertex(getSymbol().toString()+"#"+getCount());
105                graph.addChild( new Edge() , parent, vertex );
106                for( TrieNode<T> node : children ) {
107                        node.getGraph(vertex, graph);
108                }               
109        }
110
111}
Note: See TracBrowser for help on using the repository browser.