Замена символов в строке (текстовом поле) словарными ключами - PullRequest
2 голосов
/ 14 марта 2020

У меня есть приложение WPF, которое имеет 2 текстовых поля, одно из которых заполняется зашифрованным текстом (из txt-файла), а одно из них заполняется ссылочным текстом (также из txt-файла). Я должен посчитать, сколько раз каждый символ алфавита повторяется в обоих текстах, и просто переключать символы, чтобы зашифрованный текст расшифровывался.

Теперь мне нужно переключать символы, где количество повторений в оба текста одинаковы (или если это одно и то же количество повторений, просто возьмите первый) и примените его к зашифрованному текстовому полю (поэтому, когда я нажму на кнопку расшифровки, это изменит буквы в текстовом поле).

Вот код, который у меня пока есть:

public partial class MainWindow : Window
    {
        public static SortedDictionary<char, int> Count(string stringToCount)
        {
            SortedDictionary<char, int> characterCount = new SortedDictionary<char, int>();

            foreach (var character in stringToCount)
            {
                int counter = 0;
                characterCount.TryGetValue(character, out counter);
                characterCount[character] = counter + 1;
            }
            return characterCount;
        }
        public MainWindow()
        {
            InitializeComponent();
        }
        private void button2_Click(object sender, RoutedEventArgs ex) //Decipher button
        {
            var ciphered = Count(textBox.Text);
            var referenced = Count(textBox1.Text);
            var deciphered= "";

            foreach (var val in ciphered)
            {
                foreach (var x in referenced)
                {
                    if (val.Value == x.Value)
                    {
                        deciphered = textBox.Text.Replace(val.Key.ToString(), x.Key.ToString());
                    }
                }
            }

            textBox.Text = deciphered;
        }
    }

Вышеприведенный код "вроде" работает, но мне приходится нажимать кнопку несколько раз, когда это нужно сделать одним щелчком мыши. .

Вся помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Я думаю, что вы перебираете не ту вещь. Вы хотите заменить каждый символ один раз, поэтому вы должны перебирать каждый символ один раз:)

Существует несколько способов сделать это. Вот один из них, который я однажды использовал в предисловии к уроку программирования. Я считаю, что это легче понять, но не самым эффективным:

// A dictionary that for every char, it indicates what should be the replacement
Dictionary <char, char> Replacements = .... // I think you know how to do this :)

// Iterate over every char, so you never change the same char twice
for(int position = 0; position < ciphered.Lenght; position++)
{
    ciphered[position] = Replacement[ciphered[position]];
}
0 голосов
/ 14 марта 2020

Ваша программа верна, но ваша логика c не такова, я объясняю:

например, у вас один и тот же счетчик для 'x' и 'o'.

сначала, x заменяется на o

, но далее в l oop вы заменяете o на x ..., поэтому конечная операция равна нулю. символ с тем же счетчиком

и когда вы нажимаете несколько раз, вы видите результат для вашей маленькой модификации

, чтобы избежать этой проблемы, вы могли бы повторить x раз процесс: (здесь я выбираю l oop 10 раз) просто измените button2_click

    private void button2_Click(object sender, RoutedEventArgs ex) //Decipher button
    {
        var deciphered = "";
         // loop to repeat the processus 
        for (int i = 0; i < 10; i++)
        {
            var ciphered = Count(textBox.Text);
            var referenced = Count(textBox1.Text);

            foreach (var val in ciphered)
            {
                foreach (var x in referenced)
                {
                    if (val.Value == x.Value && val.Key != x.Key)
                    {
                        deciphered = textBox.Text.Replace(val.Key.ToString(), x.Key.ToString());
                    }
                }
            }
            textBox.Text = deciphered;
        }

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