Определить букву, встречающуюся чаще всего и количество её повторений. Если таких несколько вывести ту что раньше по алфавиту
В основном, я выполнил задачу, но вывести ту что по алфавиту раньше не получается. Помогите пожалуйста
{
string str = "morgana liliput katarakta fartuna sueta sleep";
int max = 0;
string symbol = "z";
for (int i = 0; i < str.Length; i++)
{
int check = 0;
for (int j = 0; j < str.Length; j++)
{
if(str[i].ToString() == " "){continue;}
if (str[i] == str[j])
{
check++;
}
if (check > max)
{
max = check;
symbol = str[i].ToString();
}
}
}
}
Console.WriteLine($"Cамая часто встречающаяся буква <<{symbol}>> она повторяется {max} раз");
}
Ответы (2 шт):
Автор решения: Yotic
→ Ссылка
string result = "morgana liliput katarakta fartuna sueta sleep"
.Where(z => char.IsLetter(z))
.GroupBy(z => z)
.OrderBy(c => c.Key)
.ToDictionary(grp => grp.Key, grp => grp.Count())
.ToList()
.OrderBy(z => z.Value)
.Last()
.ToString();
Автор решения: iKuzmychov
→ Ссылка
Достаточно просто добавить свой компаратор и Linq-запрос уменьшиться в разы и станет намного эффективнее, чем код @Yotic.
Компаратор:
public class LettersComparer : IComparer<IGrouping<char, char>>
{
public int Compare(IGrouping<char, char>? x, IGrouping<char, char>? y)
{
if (x is null)
throw new ArgumentNullException(nameof(x));
if (y is null)
throw new ArgumentNullException(nameof(y));
if (x.Count() == y.Count()) // если количество символов одинаковое - "большим" из них счиатется тот, что раньше по алфавиту
{
if (x.Key == y.Key)
return 0;
else if (x.Key < y.Key)
return 1;
else
return -1;
}
else if (x.Count() > y.Count())
{
return 1;
}
else
{
return -1;
}
}
}
Код:
var text = "morgana liliput katarakta fartuna sueta sleep";
var letters = text.Where(symbol => char.IsLetter(symbol));
if (letters.Any())
{
var result = letters
.GroupBy(letter => letter)
.MaxBy(group => group, new LettersComparer())!;
var letter = result.Key;
var count = result.Count();
Console.WriteLine($"Наиболее повторяемая буква - {letter} ({count} повторений).");
}
else
{
Console.WriteLine($"В заданном тексте нет букв.");
}