7

该算法设置为在第一个单词上运行或直到它填充四个编码字符串。例如,输入“Horrible Great”的结果是:H612。它忽略了第二个单词,或者换句话说,它只需要第二个单词的第一个字母来填充编码的字符串。

我想通过取第一个单词并找到它的编码字符串来改变它,然后取第二个单词并找到它的编码字符串;输出应该是“H614 G600”。我想知道是否有办法通过对 **this code进行一些更改来做到这一点。
非常感谢 :)

    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();
    }
4

3 回答 3

4

当然,这是我想出的解决方案。我用另一种拆分字符串并调用原始方法的方法包装了现有算法。要使用它,您将调用 SoundexByWord("Horrible Great") 而不是调用 Soundex("Horrible Great") 并获得“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);
}
于 2011-10-05T17:13:41.237 回答
0

是 - 首先将字符串解析为单词数组(在您选择分隔符之后)

然后对每个单词执行此操作

然后以某种可接受的方式组合结果并返回。

于 2011-10-04T18:19:47.357 回答
0

问题中的实现是正确的,但使用字符串操作会产生过多的垃圾。这是一个基于字符数组的实现,它更快并且产生的垃圾很少。它被设计为一种扩展方法,它也处理短语(用空格分隔的单词):

    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 );
    }
于 2014-06-25T17:06:25.937 回答