    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    }