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 }