Soundex.java


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


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


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