![](/img/trans.png)
[英]Output of Soundex algorithm implementation is wrong for cases - “Tymczak” and “Pfister”
[英]Some changes on Soundex Algorithm
該算法設置為在第一個單詞上運行或直到它填充四個編碼的字符串。 例如,輸入“Horrible Great”的結果是:H612。 它忽略了第二個單詞,換句話說,它只需要第二個單詞的第一個字母來填充編碼的字符串。
我想通過取第一個單詞並找到它的編碼字符串來改變它,然后取第二個單詞並找到它的編碼字符串; 輸出應為“H614 G600”。 我想知道是否有辦法通過改變** 代碼來做到這一點。
非常感謝 :)
private string Soundex(string data)
{
StringBuilder result = new StringBuilder();
if (data != null && data.Length > 0)
{
string previousCode = "", currentCode = "", currentLetter = "";
result.Append(data.Substring(0, 1));
for (int i = 1; i < data.Length; i++)
{
currentLetter = data.Substring(i,1).ToLower();
currentCode = "";
if ("bfpv".IndexOf(currentLetter) > -1)
currentCode = "1";
else if ("cgjkqsxz".IndexOf(currentLetter) > -1)
currentCode = "2";
else if ("dt".IndexOf(currentLetter) > -1)
currentCode = "3";
else if (currentLetter == "l")
currentCode = "4";
else if ("mn".IndexOf(currentLetter) > -1)
currentCode = "5";
else if (currentLetter == "r")
currentCode = "6";
if (currentCode != previousCode)
result.Append(currentCode);
if (result.Length == 4) break;
if (currentCode != "")
previousCode = currentCode;
}
}
if (result.Length < 4)
result.Append(new String('0', 4 - result.Length));
return result.ToString().ToUpper();
}
當然,這是我提出的解決方案。 我用另一種方法包裝現有算法,該方法拆分字符串並調用原始方法。 要使用它,你可以調用SoundexByWord(“Horrible Great”)而不是調用Soundex(“可怕的大”)並得到“H614 G630”的輸出。
private string SoundexByWord(string data)
{
var soundexes = new List<string>();
foreach(var str in data.Split(' ')){
soundexes.Add(Soundex(str));
}
#if Net35OrLower
// string.Join in .Net 3.5 and before require the second parameter to be an array.
return string.Join(" ", soundexes.ToArray());
#endif
// string.Join in .Net 4 has an overload that takes IEnumerable<string>
return string.Join(" ", soundexes);
}
問題中的實現是正確的,但是使用字符串操作會產生過多的垃圾。 這是一個基於Char數組的實現,速度更快,創建的垃圾很少。 它被設計為一種擴展方法,它也處理短語(用空格分隔的單詞):
public static String Soundex( this String input )
{
var words = input.Split( ' ' );
var result = new String[ words.Length ];
for( var i = 0; i < words.Length; i++ )
result[ i ] = words[ i ].SoundexWord();
return String.Join( ",", result );
}
private static String SoundexWord( this String input )
{
var result = new Char[ 4 ] { '0', '0', '0', '0' };
var inputArray = input.ToUpper().ToCharArray();
if( inputArray.Length > 0 )
{
var previousCode = ' ';
var resultIndex = 0;
result[ resultIndex ] = inputArray[ 0 ];
for( var i = 1; i < inputArray.Length; i++ )
{
var currentLetter = inputArray[ i ];
var currentCode = ' ';
if( "BFPV".IndexOf( currentLetter ) > -1 )
currentCode = '1';
else if( "CGJKQSXZ".IndexOf( currentLetter ) > -1 )
currentCode = '2';
else if( "DT".IndexOf( currentLetter ) > -1 )
currentCode = '3';
else if( currentLetter == 'L' )
currentCode = '4';
else if( "MN".IndexOf( currentLetter ) > -1 )
currentCode = '5';
else if( currentLetter == 'R' )
currentCode = '6';
if( currentCode != ' ' && currentCode != previousCode )
result[ ++resultIndex ] = currentCode;
if( resultIndex == 3 ) break;
if( currentCode != ' ' )
previousCode = currentCode;
}
}
return new String( result );
}
是 - 首先將字符串解析為一個單詞數組(在您選擇一個分隔符之后)
然后對每個單詞執行此操作
然后以一些可接受的方式匯總結果並返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.