001package org.maltparser.core.feature.spec; 002 003import java.util.Iterator; 004import java.util.Set; 005import java.util.TreeSet; 006import java.util.regex.Pattern; 007 008/** 009* 010* 011* @author Johan Hall 012*/ 013public class SpecificationSubModel implements Iterable<String> { 014 private final Pattern blanks = Pattern.compile("\\s+"); 015 private final Set<String> featureSpecSet; 016 private final String name; 017 018 019 public SpecificationSubModel() { 020 this("MAIN"); 021 } 022 023 public SpecificationSubModel(String _name) { 024 this.name = _name; 025 this.featureSpecSet = new TreeSet<String>(); 026 } 027 028 public void add(String featureSpec) { 029 if (featureSpec != null && featureSpec.trim().length() > 0) { 030 String strippedFeatureSpec = blanks.matcher(featureSpec).replaceAll(""); 031 featureSpecSet.add(strippedFeatureSpec); 032 } 033 } 034 035 public String getSubModelName() { 036 return name; 037 } 038 039 public int size() { 040 return featureSpecSet.size(); 041 } 042 043 public Iterator<String> iterator() { 044 return featureSpecSet.iterator(); 045 } 046 047 public String toString() { 048 StringBuilder sb = new StringBuilder(); 049 for (String str : featureSpecSet) { 050 sb.append(str); 051 sb.append('\n'); 052 } 053 return sb.toString(); 054 } 055 056 @Override 057 public int hashCode() { 058 final int prime = 31; 059 int result = 1; 060 result = prime * result 061 + ((featureSpecSet == null) ? 0 : featureSpecSet.hashCode()); 062 result = prime * result + ((name == null) ? 0 : name.hashCode()); 063 return result; 064 } 065 066 @Override 067 public boolean equals(Object obj) { 068 if (this == obj) 069 return true; 070 if (obj == null) 071 return false; 072 if (getClass() != obj.getClass()) 073 return false; 074 SpecificationSubModel other = (SpecificationSubModel) obj; 075 if (featureSpecSet == null) { 076 if (other.featureSpecSet != null) 077 return false; 078 } else if (!featureSpecSet.equals(other.featureSpecSet)) 079 return false; 080 if (name == null) { 081 if (other.name != null) 082 return false; 083 } else if (!name.equals(other.name)) 084 return false; 085 return true; 086 } 087}