7

このアルゴリズムは、最初の単語に対して実行されるか、エンコードされた4つの文字列がいっぱいになるまで実行されるように設定されています。たとえば、「HorribleGreat」という入力の結果はH612です。2番目の単語を無視します。つまり、エンコードされた文字列を埋めるために2番目の単語の最初の文字だけを使用します。

最初の単語を取得してそのエンコードされた文字列を見つけ、次に2番目の単語を取得してそのエンコードされた文字列を見つけることによって変更したいと思います。出力は「H614G600」である必要があります。親切に私は**このコードにいくつかの変更を行うことによってそれを行う方法があるかどうか知りたいです。
どうもありがとう :)

    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

確かに、これが私が思いついた解決策です。文字列を分割して元のメソッドを呼び出す別のメソッドで既存のアルゴリズムをラップしました。これを使用するには、Soundex("Horrible Great") を呼び出す代わりに SoundexByWord("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 に答える