Рейтинг:
31
OriginalGriff
Во - первых, ваш словарь ошибочен: вам нужно количество повторяющихся символов, поэтому ваш ключ должен быть уникальной частью - символом, а значение должно быть их количеством
Dictionary<char, int> charCounts = new Dictionary<char, int>();
Теперь вы можете проверить, существует ли символ в словаре каждый раз, когда вы сталкиваетесь с ним, и либо добавить его, либо увеличить количество.
Во - вторых, ваш код вообще не проверяет наличие букв, он просто зацикливается на строках в массиве и копирует их в словарь, используя индекс массива в качестве счетчика, что совершенно бессмысленно.
Вернитесь к своему домашнему вопросу и внимательно прочитайте его. Если вы должны считать символы, то это означает обработку каждой строки в массиве, а не подсчет строк вообще.
Я подозреваю, что вы должны найти либо "сколько 'H есть в массиве строк?", либо "сколько строк имеют 'H' в качестве первой буквы?" - но в любом случае вам нужно подумать немного более тщательно, прежде чем прыгать в код. Помните, что словарь не может иметь дубликатов ключей ...
Maciej Los
5ed!
Кстати: я не видел вашего ответа, когда публиковал свой.
OriginalGriff
Все в порядке - я тоже не видел вашего, когда печатал свой! :смеяться:
Рейтинг:
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
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 коробки очень хорошего польского пива. Согласен?