All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mvel2.util.Soundex Maven / Gradle / Ivy

/**
 * MVEL 2.0
 * Copyright (C) 2007 The Codehaus
 * Mike Brock, Dhanji Prasanna, John Graham, Mark Proctor
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.mvel2.util;

/**
 * An implementation of Knuth's soundex algorithm.  Used by the soundslike operator.
 */
public class Soundex {

    /* Implements the mapping
    * from: AEHIOUWYBFPVCGJKQSXZDTLMNR
    * to:   00000000111122222222334556
    */
    public static final char[] MAP = {
            //A   B    C    D    E    F    G    H    I    J    K    L    M
            '0', '1', '2', '3', '0', '1', '2', '0', '0', '2', '2', '4', '5',
            //N  O   P   W   R   S   T   U   V   W   X   Y   Z
            '5', '0', '1', '2', '6', '2', '3', '0', '1', '0', '2', '0', '2' };

    /**
     * Convert the given String to its Soundex code.
     *
     * @param s input string
     * @return null If the given string can't be mapped to Soundex.
     */
    public static String soundex(String s) {
        char[] ca = s.toUpperCase().toCharArray();

        StringBuilder res = new StringBuilder();
        char c, prev = '?';

        // Main loop: find up to 4 chars that map.
        for (int i = 0; i < ca.length && res.length() < 4 && (c = ca[i]) != ','; i++) {

            // Check to see if the given character is alphabetic.
            // Text is already converted to uppercase. Algorithm
            // only handles ASCII letters, do NOT use Character.isLetter()!
            // Also, skip double letters.
            if (c >= 'A' && c <= 'Z' && c != prev) {
                prev = c;

                char m = MAP[c - 'A'];
                if (m != '0') res.append(m);
            }
        }

        if (res.length() == 0) return null;

        for (int i = res.length(); i < 4; i++)
            res.append('0');

        return res.toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy