001    package org.maltparser.core.feature.spec;
002    
003    import java.util.Iterator;
004    import java.util.LinkedHashMap;
005    import java.util.Map;
006    
007    /**
008    *
009    *
010    * @author Johan Hall
011    */
012    public class SpecificationSubModel implements Iterable<String> {
013            private Map<String, Integer> featureSpec2IndexMap;
014            private int counter;
015            private String name;
016            
017            public SpecificationSubModel() {
018                    this("MAIN");
019            }
020            
021            public SpecificationSubModel(String name) {
022                    setSubModelName(name);
023                    featureSpec2IndexMap = new LinkedHashMap<String, Integer>();
024                    counter = 0;
025            }
026            
027            public void add(String featureSpec) {
028                    if (!featureSpec2IndexMap.containsKey(featureSpec)) {
029                            featureSpec2IndexMap.put(featureSpec, counter++);
030                    }
031            }
032            
033            public int getFeatureIndex(String featureSpec) {
034                    if (featureSpec2IndexMap.containsKey(featureSpec)) {
035                            return -1;
036                    }
037                    return featureSpec2IndexMap.get(featureSpec);
038            }
039            
040            public String getFeatureSpec(int featureId) {
041                    if (featureId < 0 || featureId >= featureSpec2IndexMap.size()) {
042                            return null;
043                    }
044                    return featureSpec2IndexMap.keySet().toArray(new String[]{})[featureId];
045            }
046    
047            public String getSubModelName() {
048                    return name;
049            }
050    
051            public void setSubModelName(String name) {
052                    this.name = name;
053            }
054    
055            public int size() {
056                    return featureSpec2IndexMap.size();
057            }
058            
059            public Iterator<String> iterator() {
060                    return featureSpec2IndexMap.keySet().iterator();
061            }
062            
063            public boolean equals(Object obj) {
064                    if (this == obj)
065                            return true;
066                    if (obj == null)
067                            return false;
068                    if (getClass() != obj.getClass())
069                            return false;
070                    if (featureSpec2IndexMap.size() != ((SpecificationSubModel)obj).size()) { return false; }
071                    for (String str : this) {
072                            if (!str.equals(((SpecificationSubModel)obj).getFeatureSpec(featureSpec2IndexMap.get(str)))) {
073                                    return false;
074                            }
075                    }
076                    return true;
077            }
078    
079            public String toString() {
080                    StringBuilder sb = new StringBuilder();
081                    for (String str : this) {
082                            sb.append(featureSpec2IndexMap.get(str));
083                            sb.append('\t');
084                            sb.append(str);
085                            sb.append('\n');
086                    }
087                    return sb.toString();
088            }
089    }