Soundex2.java


Below is the syntax highlighted version of Soundex2.java from §3.1 Using Data Types.


/******************************************************************************
 *  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);
    }
}


Copyright © 2000–2022, Robert Sedgewick and Kevin Wayne.
Last updated: Thu Aug 11 10:22:01 EDT 2022.