001    package org.maltparser.ml.lib;
002    
003    import java.util.ArrayList;
004    
005    
006    /**
007     * The feature list is sorted according to the compareTo of the node.
008     * 
009     * @author Johan Hall
010     *
011     */
012    public class FeatureList  {
013            private static final long serialVersionUID = 7526471155622776147L;
014            private ArrayList<MaltFeatureNode> list;
015            
016            /**
017             * Creates a feature list of MaltFeatureNode objects
018             */
019            public FeatureList() {
020                    list = new ArrayList<MaltFeatureNode>();
021            }
022            
023            /**
024             * Adds a MaltFeatureNode object to the feature list. The object will be added in the sorted feature list based on 
025             * the compareTo() in MaltFeatureNode.
026             * 
027             * @param x a MaltFeatureNode object
028             */
029            public void add(MaltFeatureNode x) {
030                    if (list.size() == 0) {
031                            list.add(x);
032                    } else {
033                    int low = 0;
034                    int high = list.size() - 1;
035                    int mid;
036                    
037                    while( low <= high ) {
038                        mid = (low + high) / 2;
039            
040                        if( list.get(mid).compareTo(x) < 0 ) {
041                            low = mid + 1;
042                        } else if( list.get(mid).compareTo(x) > 0 ) {
043                            high = mid - 1;
044                        } else {
045                            break;
046                        }
047                    }
048                    list.add(low,x);
049                    }
050            }
051            
052            /**
053             * Adds an index/value pair to the feature list.
054             * 
055             * @param index a binarized feature index
056             * @param value a value 
057             */
058            public void add(int index, double value) {
059                    add(new MaltFeatureNode(index,value));
060            }
061            
062            /**
063             * @param i the position in the feature list
064             * @return a MaltFeatureNode object located on the position <i>i</i>
065             */
066            public MaltFeatureNode get(int i) {
067                    if (i < 0 || i >= size()) {
068                            return null;
069                    }
070                    return list.get(i);
071            }
072            
073            /**
074             * Clears the feature list
075             */
076            public void clear() {
077                    list.clear();
078            }
079            
080            /**
081             * @return the size of the feature list
082             */
083            public int size() {
084                    return list.size();
085            }
086            
087            public MaltFeatureNode[] toArray() {
088                    final MaltFeatureNode[] nodes = new MaltFeatureNode[list.size()];
089                    int len = nodes.length;
090                    for (int i = 0; i < len; i++) {
091                            nodes[i] = list.get(i);
092                    }
093                    return nodes;
094            }
095    }