0

Юзер вводит большой текст. Требуется создать частотный словарь. это словарь в котором ключ уникальное слово из текста, а значение числовое. Сколько раз в тексте встречается данное слово?

Машина машина собака машина собака свинья 
Машина  3 
собака  2
свинья  1

Что я пробовал: Я инициализировал словарь, и разделил введенный юзером текст с помощью Split. Затем, я проверяю с помощью счетчика, одинакового ли нынешнее слово со следующим. Если одинаково, добавляю в копилку. Ошибка: Индекс вне границ

var Dictionary = new Dictionary<string, string>();
Console.WriteLine("Вводи большой текст");
string text = Console.ReadLine();
string[] newText = text.Split(' ');

int counterRepeat = 0; for (int i = 0; i < newText.Length; i++) { if (newText[i] == newText[i + 1]) { counterRepeat++; } }

Sergey K.
  • 2,127
yeah
  • 9
  • 1
    ну и очевидно же! если newText[i] будет последний элемента, то что должно быть в newText[i + 1]? Примитивной отладке уже совсем не учат? Кстати, этот код считает совсем не то, что нужно. – Эникейщик Feb 13 '23 at 16:46
  • Начните с этого Требуется создать частотный словарь. это словарь в котором ключ уникальное слово из текста, а значение числовое. – tym32167 Feb 13 '23 at 16:48
  • Связанный вопрос https://ru.stackoverflow.com/a/1135932/179763 – tym32167 Feb 13 '23 at 16:51
  • https://ru.stackoverflow.com/a/840434/220553 – EvgeniyZ Feb 13 '23 at 17:36

2 Answers2

2

Самый простой вариант сделать то, что вам нужно, - это LINQ:

var text = "Машина машина собака машина собака свинья";

var dictionary = text.Split() .GroupBy(word => word) // группируем одинаковые слова .ToDictionary(group => group, group => group.Count()); // превращаем группы в словарь

iikuzmychov
  • 3,092
1

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

Вот реализация:

using System;
using System.Collections.Generic;

public class Counter { public static void Main(string[] args) { var counts = new Dictionary<string, int>(); Console.Write("Input your text: "); string text = Console.ReadLine(); string[] words = text.Split(' ');

// Пробегаемся по полученную после разделения текста массиву слов и складываем в словарь foreach(var word in words) { if (!counts.ContainsKey(word.ToLower())) counts.Add(word.ToLower(), 1); else counts[word] += 1; }

// Пробегаемся по словарю и выводим все элементы foreach(var pair in counts) { Console.WriteLine(pair.Key + ": " + pair.Value); } } }

Sergey K.
  • 2,127
  • 1
    спасибо! единственное что осталось непонятным, это восклицательный знак перед counts, что он значит в данном коде? – yeah Feb 13 '23 at 18:26
  • @yeah, это оператор "отрицание", то есть всё описанное условие становится "не". В данном случае читается условие так "если НЕ содержится в словаре ключа являющегося словом из массива, то добавить его и к нему значение 1" – Sergey K. Feb 13 '23 at 18:41