package com.nicusa.util; import java.util.Collections; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public enum NormalizeStateCode { ALABAMA("Alabama","AL","US-AL"), ALASKA("Alaska","AK","US-AK"), ARIZONA("Arizona","AZ","US-AZ"), ARKANSAS("Arkansas","AR","US-AR"), CALIFORNIA("California","CA","US-CA"), COLORADO("Colorado","CO","US-CO"), CONNECTICUT("Connecticut","CT","US-CT"), DELAWARE("Delaware","DE","US-DE"), DISTRICT_OF_COLUMBIA("of Columbia","DC","US-DC"), FLORIDA("Florida","FL","US-FL"), GEORGIA("Georgia","GA","US-GA"), HAWAII("Hawaii","HI","US-HI"), IDAHO("Idaho","ID","US-ID"), ILLINOIS("Illinois","IL","US-IL"), INDIANA("Indiana","IN","US-IN"), IOWA("Iowa","IA","US-IA"), KANSAS("Kansas","KS","US-KS"), KENTUCKY("Kentucky","KY","US-KY"), LOUISIANA("Louisiana","LA","US-LA"), MAINE("Maine","ME","US-ME"), MARYLAND("Maryland","MD","US-MD"), MASSACHUSETTS("Massachusetts","MA","US-MA"), MICHIGAN("Michigan","MI","US-MI"), MINNESOTA("Minnesota","MN","US-MN"), MISSISSIPPI("Mississippi","MS","US-MS"), MISSOURI("Missouri","MO","US-MO"), MONTANA("Montana","MT","US-MT"), NEBRASKA("Nebraska","NE","US-NE"), NEVADA("Nevada","NV","US-NV"), NEW_HAMPSHIRE("New Hampshire","NH","US-NH"), NEW_JERSEY("New Jersey","NJ","US-NJ"), NEW_MEXICO("New Mexico","NM","US-NM"), NEW_YORK("New York","NY","US-NY"), NORTH_CAROLINA("North Carolina","NC","US-NC"), NORTH_DAKOTA("North Dakota","ND","US-ND"), OHIO("Ohio","OH","US-OH"), OKLAHOMA("Oklahoma","OK","US-OK"), OREGON("Oregon","OR","US-OR"), PENNSYLVANIA("Pennsylvania","PA","US-PA"), RHODE_ISLAND("Rhode Island","RI","US-RI"), SOUTH_CAROLINA("South Carolina","SC","US-SC"), SOUTH_DAKOTA("South Dakota","SD","US-SD"), TENNESSEE("Tennessee","TN","US-TN"), TEXAS("Texas","TX","US-TX"), UTAH("Utah","UT","US-UT"), VERMONT("Vermont","VT","US-VT"), VIRGINIA("Virginia","VA","US-VA"), WASHINGTON("Washington","WA","US-WA"), WEST_VIRGINIA("West Virginia","WV","US-WV"), WISCONSIN("Wisconsin","WI","US-WI"), WYOMING("Wyoming","WY","US-WY"), PUERTO_RICO("Puerto Rico","PR","US-PR"), UNITED_STATES("United States", "US", "Nationwide"); String unnabreviated; String ANSIabbreviation; String ISOabbreviation; NormalizeStateCode(String unnabreviated, String ANSIabbreviation, String ISOabbreviation) { this.unnabreviated = unnabreviated; this.ANSIabbreviation = ANSIabbreviation; this.ISOabbreviation = ISOabbreviation; } public String toString () { return this.ANSIabbreviation; } /** * check two terms against unabreviated. */ private static NormalizeStateCode twoCheck ( String a, String b ) { String input = a + " " + b; for (NormalizeStateCode state : values()) { if (state.unnabreviated.equalsIgnoreCase(input)) { return state; } } return null; } /** * check one term against all state codes. */ private static NormalizeStateCode oneCheck ( String input ) { for (NormalizeStateCode state : values()) { if (state.unnabreviated.equalsIgnoreCase(input) || state.ANSIabbreviation.equalsIgnoreCase(input) || state.ISOabbreviation.equalsIgnoreCase(input)) { return state; } } return null; } public static String parseToJson ( String input ) { Set<NormalizeStateCode> rv = parse( input ); StringBuilder sb = new StringBuilder(); sb.append( '[' ); Iterator<NormalizeStateCode> iter = rv.iterator(); while ( iter.hasNext() ) { NormalizeStateCode sc = iter.next(); sb.append( '"' ); sb.append( sc.toString() ); sb.append( '"' ); if ( iter.hasNext() ) { sb.append( ", " ); } } sb.append( ']' ); return sb.toString(); } /** * Parse string input to enum. String will contain a poorly normalized * list of state data and miscellaneous words to ignore. * @param input String to parse * @return A list of all states matched. */ public static Set<NormalizeStateCode> parse(String input) { if (null == input) { return null; } StringBuilder sb = new StringBuilder(); char last = ' '; for (int i = 0; i < input.length(); i++ ) { char c = input.charAt(i); if ( Character.isLetter( c )) { sb.append( c ); last = c; } else if ( last != ' ' ) { sb.append( ' ' ); last = ' '; } } String[] terms = sb.toString().trim().split( " " ); Set<NormalizeStateCode> rv = new TreeSet<NormalizeStateCode>(); for (int i = 0; i < terms.length; i++ ) { NormalizeStateCode cd = oneCheck( terms[i] ); if ( cd != null ) { rv.add( cd ); } else if ( i < terms.length - 1 ) { cd = twoCheck( terms[i], terms[i+1] ); if ( cd != null ) { rv.add( cd ); } } } // default to united states if ( rv.contains( NormalizeStateCode.UNITED_STATES )) { return Collections.emptySet(); } else { return rv; } } }