/****************************************************************************** * Compilation: javac Soundex2.java * Execution: java Soundex2 word1 word2 * * Sample execution: * * % java Soundex Wohrzhick Warzick * W620: Wohrzhick * W620: Warzick * * % java Soundex Smith Smyth * S530: Smith * S530: Smyth * * % java Soundex Washington Lee * W252: Washington * L000: Lee * * % java Soundex Pfister Jackson * P236: Pfister * J500: Jackson * * Note: we ignore the "Names with Prefix" and "Constant Separator" * rules from * http://www.archives.gov/research_room/genealogy/census/soundex.html * ******************************************************************************/ public class Soundex2 { public static String soundex(String s) { s = s.toUpperCase(); // extract first letter char firstLetter = s.charAt(0); // replace letter with numeric code s = s.replaceAll("[AEHIOUWY]", "0"); s = s.replaceAll("[BFPV]", "1"); s = s.replaceAll("[CGJKQSXZ]", "2"); s = s.replaceAll("[DT]", "3"); s = s.replaceAll("[L]", "4"); s = s.replaceAll("[MN]", "5"); s = s.replaceAll("[R]", "6"); // remove duplicates s = s.replaceAll("11+", "1"); s = s.replaceAll("22+", "2"); s = s.replaceAll("33+", "3"); s = s.replaceAll("44+", "4"); s = s.replaceAll("55+", "5"); s = s.replaceAll("66+", "6"); // remove 0s s = s.replaceAll("0", ""); s = firstLetter + s.substring(1) + "000"; return s.substring(0, 4); } public static void main(String[] args) { String name = args[0]; String code = soundex(name); StdOut.println(code + ": " + name); } }