/****************************************************************************** * Compilation: javac Soundex.java * Execution: java surname1 surname2 * * * % java Soundex Wohrzhick Warzick * W622: Wohrzhick * W622: Warzick * * % java Soundex Smith Smyth * S530: Smith * S530: Smyth * * % java Soundex Washington Lee * W252: Washington * L000: Lee * * % java Soundex Pfister Jackson * P236: Pfister * J250: Jackson * * % java Soundex Scott Numbers * S300: Scott * N516: Numbers * * Note: we ignore the "Names with Prefix" and "Constant Separator" * rules from * http://www.archives.gov/research_room/genealogy/census/soundex.html * ******************************************************************************/ public class Soundex { public static String soundex(String s) { char[] x = s.toUpperCase().toCharArray(); char firstLetter = x[0]; // convert letters to numeric code for (int i = 0; i < x.length; i++) { switch (x[i]) { case 'B': case 'F': case 'P': case 'V': x[i] = '1'; break; case 'C': case 'G': case 'J': case 'K': case 'Q': case 'S': case 'X': case 'Z': x[i] = '2'; break; case 'D': case 'T': x[i] = '3'; break; case 'L': x[i] = '4'; break; case 'M': case 'N': x[i] = '5'; break; case 'R': x[i] = '6'; break; default: x[i] = '0'; break; } } // remove duplicates String output = "" + firstLetter; for (int i = 1; i < x.length; i++) if (x[i] != x[i-1] && x[i] != '0') output += x[i]; // pad with 0's or truncate output = output + "0000"; return output.substring(0, 4); } public static void main(String[] args) { String name1 = args[0]; String name2 = args[1]; String code1 = soundex(name1); String code2 = soundex(name2); StdOut.println(code1 + ": " + name1); StdOut.println(code2 + ": " + name2); } }