Некоторые изменения в алгоритме Soundex - PullRequest
7 голосов
/ 04 октября 2011

Этот алгоритм настроен на запуск первого слова или до заполнения четырех закодированных строк. Например, результат ввода «Ужасный Великий»: 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();
    }

Ответы [ 3 ]

4 голосов
/ 05 октября 2011

Конечно, вот решение, которое я придумал.Я обернул существующий алгоритм другим методом, который разбивает строки и вызывает оригинальный метод.Чтобы использовать это, вы должны вызвать SoundexByWord («Ужасное Великое») вместо вызова Soundex («Ужасное Великое») и получить вывод «H614 G630».

0 голосов
/ 25 июня 2014

Реализация в вопросе правильная, но создает лишний мусор со строковыми операциями.Вот реализация на основе массива 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 );
    }
0 голосов
/ 04 октября 2011

да - сначала разберите строку в массив слов (после выбора разделителя)

затем сделайте это для каждого слова

затем соберите результаты некоторым приемлемым способом и верните.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...