Virendra S from Bangalore, Karnataka Ответов: 4

Как проверить количество повторяющихся букв в массиве с помощью словаря C#


Я хочу отобразить количество повторяющихся букв в массиве с помощью словаря.
Как это осуществить?
ниже приведен пример кода. пожалуйста, объясните дальнейшую реализацию логики.

Что я уже пробовал:

string[] inputArray = new string[] { "Hello1", "Hello2", "Hello3" };
            var map = new Dictionary<int, string>();
            for (int i = 0; i < inputArray.Length; i++)
            {
                map.Add(i,inputArray[i]);
            }

            foreach (var mapitem in map)
            {
                int key = mapitem.Key;
                string value = mapitem.Value;
                
            }

Dominic Burford

На чем конкретно вы застряли? Вы получаете ошибку? Ваш код не работает? Можете ли вы предоставить более подробную информацию о том, в чем заключается проблема?

Virendra S from Bangalore, Karnataka

Я застрял на логической стороне, текущий код выполняется без ошибок, не получая идеи реализации для проверки количества повторяющихся букв.

BillWoodruff

Я вижу только три повторения одной буквы: "Л" :)

4 Ответов

Рейтинг:
31

OriginalGriff

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

Dictionary<char, int> charCounts = new Dictionary<char, int>();
Теперь вы можете проверить, существует ли символ в словаре каждый раз, когда вы сталкиваетесь с ним, и либо добавить его, либо увеличить количество.
Во - вторых, ваш код вообще не проверяет наличие букв, он просто зацикливается на строках в массиве и копирует их в словарь, используя индекс массива в качестве счетчика, что совершенно бессмысленно.

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

Я подозреваю, что вы должны найти либо "сколько 'H есть в массиве строк?", либо "сколько строк имеют 'H' в качестве первой буквы?" - но в любом случае вам нужно подумать немного более тщательно, прежде чем прыгать в код. Помните, что словарь не может иметь дубликатов ключей ...


Maciej Los

5ed!
Кстати: я не видел вашего ответа, когда публиковал свой.

OriginalGriff

Все в порядке - я тоже не видел вашего, когда печатал свой! :смеяться:

Maciej Los

Рейтинг:
27

Maciej Los

Если я вас хорошо понимаю, вы хотите подсчитать повторение символов в каждой строке в строковом массиве...

Итак, вы должны определить переменную словаря следующим образом:

var map = new Dictionary<char, int>();

из-за того, что Key должно быть письмо и Value должно быть число повторений Key.

string[] inputArray = new string[] { "Hello1", "Hello2", "Hello3" };
Dictionary<char, int> map = new Dictionary<char, int>();
foreach (string s in inputArray)
{
    foreach(char c in s.ToArray())
		if(!map.ContainsKey(c))
			map.Add(c, 1);
		else
			map[c]= map[c]+1;
}

foreach (var mapitem in map.Keys)
{
    Console.WriteLine($"'{mapitem}' repeats {map[mapitem]} time(s)");
}


Результат:
'H' repeats 3 time(s)
'e' repeats 3 time(s)
'l' repeats 6 time(s)
'o' repeats 3 time(s)
'1' repeats 1 time(s)
'2' repeats 1 time(s)
'3' repeats 1 time(s)


OriginalGriff

Противопоставить новичку - Незнайке, который рэп дал тебе это ...

CHill60

Только не я! Я тоже возразил. Это что, двойное противодействие? :-)

Maciej Los

Что ж, такое случается.
Спасибо, Кэролайн.

OriginalGriff

- Не знаю. Кто противостоит? :смеяться:

Maciej Los

Что ж, такое случается...
- Спасибо, пол.

Virendra S from Bangalore, Karnataka

Спасибо Мацей Лос,

Maciej Los

Всегда пожалуйста.

BillWoodruff

@OriginalGriff Привет, как вы можете сказать, когда кто-то получил отрицательный голос от члена с высокой репутацией ?

OriginalGriff

Шкала: низкий повтор имеет меньший вес, поэтому один низкий повтор 1 + один высокий повтор 5 == 4,9
один высокий повтор 1 + один высокий повтор 5 == 3,0

BillWoodruff

спасибо, я предположил, что вы используете какой-то секретный соус :)

Maciej Los

Это не волшебство! Таковы правила рейтинга и репутации, см.: Код рейтинг проекта и репутация часто задаваемые вопросы[^]
Когда есть хотя бы один голос и когда вы наведете курсор мыши на "звезды", вы увидите, сколько голосов было добавлено и сколько звезд вы достигли. В нижней части этого поля вы увидите знак вопроса [?], который содержит ссылку на правила системы голосования.

BillWoodruff

Да, но эти статистические данные не говорят, сколько очков репутации стоил данный голос "вниз"."

Рейтинг:
1

BillWoodruff

Использование Linq:

Dictionary<char, int> cntdic =
    string.Join("", this.inputArray)
        .GroupBy(c => c)
            .Select(c => new {name = c.Key, count = c.Count()})
                .ToDictionary(kvp => kvp.name, kvp => kvp.count);


Maciej Los

Приятно!

Рейтинг:
1

Maciej Los

Биллвудрафф[^] вдохновил меня написать "полную linq-версию" решения с символами, отсортированными по количеству повторений:

string[] inputArray = new string[] { "Hello1", "Hello2", "Hello3" };
Dictionary<char, int> map = inputArray
	.SelectMany(word => word.ToArray())
	.GroupBy(c=>c)
	.OrderByDescending(grp=>grp.Count())
	.Select(grp=>new KeyValuePair<char, int>(grp.Key, grp.Count()))
	.ToDictionary(kvp=> kvp.Key, kvp=>kvp.Value);


BillWoodruff

Теперь, учитывая, что я не голосовал за вас или ОГА, возникает вопрос: должен ли я голосовать за вас и ОГА за то, что они не используют Linq :)

Указав себя Заказатьпо ... требование, о котором ОП не упоминал ... каким-то образом мой код не является "полным решением Linq"?

на самом деле я намеренно избегал использования 'Aggregate with strings из-за того факта (неизменяемость строк), что он создает кучу строк, которые съедают память; для этого есть обходной путь с помощью 'StringBuilder.

Есть ли у SelectMany какое-либо внутреннее распределение: я не знаю. Было бы интересно сравнить использование времени и памяти этими методами, но, держу пари, нам пришлось бы использовать гигантские наборы данных, чтобы выявить различия.

к вашему сведению... ничего страшного... Я бы поставил звонок в "OrderBy в другом месте, чтобы сделать только один звонок в" Count() :)

ВАР cntdic =
строка.Join("", inputArray)

.Метод groupBy(с =&ГТ; в)

.Select(c => new {name = c.Key, count = c.Count()})

.OrderByDescending(ГРП =&ГТ; стеклопластик.граф)

.ToDictionary(КВП =&ГТ; КВП.имя, КВП =&ГТ; КВП.граф);

твое здоровье, Билл

Maciej Los

Вопрос не в том, чтобы голосовать против решения non-Linq, а в том, чтобы голосовать за хорошие ответы! :Д
Я использовал двойные кавычки с "full-linq-version", чтобы интерпретировать это утверждение с насмешкой.
Как я уже сказал, Вы меня вдохновили. Я хотел предоставить решение без использования [string.Метод Join ()], но с помощью [SelectMany()]. Так, таким образом, это "полный-запрос LINQ-версия" раствора.

Спасибо за ваш интересный вклад, Билл.

BillWoodruff

"Вопрос не в том, чтобы голосовать против решения non-Linq, а в том, чтобы голосовать за хорошие ответы! :Д"

Надеюсь, вы заметили смайлик в конце первого предложения :)

Есть ли у вас какие-либо конкретные знания об относительной производительности строки.Присоединяйтесь и Метода SelectMany ? Это меня интересует.

Сальвадор Дали сказал: “публике не обязательно знать, шучу я или говорю серьезно, так же как и мне самому не обязательно это знать.”

но, к сожалению, мы не очень часто бываем вместе :(

Maciej Los

А, ну да. Я видел Смайли в конце первого предложения.

Нет, у меня нет знаний о производительности струны.Присоединяйтесь и Метода SelectMany.

BillWoodruff

еще один способ улучшить свой код Linq - это удалить ненужное слово => word.ToArray() : SelectMany сгладит массив без вызова функции ' ToArray:

inputArray.SelectMany(word => word)

Maciej Los

Метод ToArray используется для получения символов (слова), а не слов ;)

BillWoodruff

'SelectMany, как я показываю в этом случае, приведет к IEnumerable<char>

Я думаю, что вам, возможно, придется навестить меня в Таиланде для дальнейшего образования :)

Maciej Los

Звучит как приглашение ;) Я возьму 2 коробки очень хорошего польского пива. Согласен?