Модификация без словаря

190
07 июля 2022, 12:10

Дано следующее задание: Вводится текст. Конец ввода F1. В тексте найти, какая из букв первого слова встречается чаще и определить количество ее повторений. (Статические методы без использования статических полей). Код решения:

using System;
using System.Collections.Generic;
using System.Text;
namespace Лабораторная_работа_2
{
    class Program
    {
        static void Main(string[] args)
        {
            var builder = new StringBuilder();
            EnterWhileNotF1(builder);
            var dicCountLetter = CountLettersFirstWordInText(builder);
            char letter =' ';
            var count = SearchMaxCountLetter(dicCountLetter, ref letter);
            Console.WriteLine();
            Console.WriteLine("Буква '{0}' из первого слова встречалась: {1}", letter, count);
        }
        static void EnterWhileNotF1(StringBuilder text)//ввод текста до ф1
        {
            var input = Console.ReadKey();
            while (input.Key != ConsoleKey.F1)
            {
                text.Append(input.KeyChar);
                input = Console.ReadKey();
            }
        }
        static Dictionary<char, int> CountLettersFirstWordInText(StringBuilder text) //Словарь с буквами первого слова и их кол-вом в тексте
        {
            var result = new Dictionary<char, int>();          
            var textSplit = text.ToString().Split();
            InitilizeDictionary(result, textSplit[0]);
            for (int i = 1;i<textSplit.Length;i++)
            {
                foreach(var e in textSplit[i])
                {
                    if(result.ContainsKey(e))
                        result[e]++;
                }
            }
            return result;
        }
        static void InitilizeDictionary(Dictionary<char, int> dic,string firstWord)// инициализируем словарь по буквам первого слова
        {           
            foreach(var e in firstWord)
            {
                dic[e] = 0;
            }
        }
        static int SearchMaxCountLetter(Dictionary<char, int> dic, ref char letter)// ищем самую популярную букву
        {
            var max = -1;
            foreach(var e in dic)
            {
                if(e.Value > max)
                {
                    max = e.Value;
                    letter = e.Key;
                }       
            }
            return max;
        }
    }
}

Нужно решить без словаря

Сделал следующее нерабочее решение:

using System;
using System.Collections.Generic;
using System.Text;
namespace Лабораторная_работа_2
{
    class Program
    {
        static void Main(string[] args)
        {
            var builder = new StringBuilder();
            EnterWhileNotF1(builder);
            var dicCountLetter = CountLettersFirstWordInText(builder);
            char letter = ' ';
            var count = SearchMaxCountLetter(dicCountLetter);
            Console.WriteLine();
            Console.WriteLine("Буква '{0}' из первого слова встречалась: {1}", letter, count);
        }
        static void EnterWhileNotF1(StringBuilder text)//ввод текста до ф1
        {
            var input = Console.ReadKey();
            while (input.Key != ConsoleKey.F1)
            {
                text.Append(input.KeyChar);
                input = Console.ReadKey();
            }
        }
        static char[,] CountLettersFirstWordInText(StringBuilder text) //Массив с буквами первого слова || и их кол-вом в тексте
        {
            var textSplit = text.ToString().Split();
            var bukvi = new char[text.Length];
            var counter = new char[text.Length];
            var result = new char[textSplit[0].Length,2];
            for (int i = 0; i < textSplit.Length; i++)
            {
                if (textSplit[0][i] != ' ')
                {
                    bukvi[i] = textSplit[0][i];
                }
                break;
            }
            for (int i = 0; i<bukvi.Length; i++)
            {
                result[i, 0] = bukvi[i];
                //result[i, 1] = Convert.ToChar(0); AAAAAAAAAAAAAAAAAA
            }
            for (int i = 0; i < textSplit[0].Length; i++)
                for (int j = 0; i < textSplit.Length; j++)
                {
                        if ((textSplit[i][j] == result[i,0]))
                            {
                                result[i,1] = Convert.ToChar(Convert.ToInt32(result[i,1])+1);
                            }
                }
            return result;
        }
        /*static void InicilizeDictionary(Dictionary<char, int> dic, string firstWord)// инициализируем словарь по буквам первого слова
        {
            foreach (var e in firstWord)
            {
                dic[e] = 0;
            }
        }
        */
        static int SearchMaxCountLetter(char[,]result)// ищем самую популярную букву
        {
            var max = -1;
            for (int i = 0; i < result.GetLength(0); i++)
            {
                if (result[i,1] > max) 
                {
                    max = result[i, 1];
                }
            }
            return max;
        }
       
    }
}

В 46-47 строке происходит выход за пределы массива, не могу это исправить

Answer 1

Если не мудрить, то примерно так получается:

private static (char, int) GetTheMostRepeatingLetter(StringBuilder sb)
{
    string text = sb.ToString();
    int count = 0;
    char result = 0;
    foreach (char letter in text.Split()[0])
    {
        int i = 0;
        foreach (char c in text)
        {
            if (c == letter)
                i++;    
        }
        if (i > count)
        {
            count = i;
            result = c;
        }
    }
    return (result, count);
}
(char c, int count) = GetTheMostRepeatingLetter(sb);
Console.WriteLine("Буква: {0}, Повторений: {1}", c, count);
READ ALSO
Нет расстановки по убыванию [дубликат]

Нет расстановки по убыванию [дубликат]

Подскажите пожалуйста , как решить проблемуВвожу текст , жму F3 и программа завершается без расстановки

237
TcpClient не принимает данные

TcpClient не принимает данные

Есть код принятия данных с TcpClientОн работает в таске, имитирующем клиент, но не в классе клиента

177
WPF просто Grid Binding [закрыт]

WPF просто Grid Binding [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

190