org.mvel2.util.Soundex Maven / Gradle / Ivy
The newest version!
/**
* 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();
}
}