Как подсчитать количество вхождений каждого слова в предложение в c #? [Дубликат]

Точка с запятой в конце, если (a == b); просто закончить оператор в одной строке, что означает игнорировать результат условия и продолжить выполнение из следующей строки. Этот код полезен, с другой стороны, когда-то вводит ошибку в программу, например, случай 1. a = 5; b = 3; если (a == b); prinf («a и b равны»); случай 2. a = 5; b = 5; если (a == b); prinf («a и b равны»); будет печатать тот же результат на экране ...

12
задан Bill the Lizard 20 September 2012 в 21:51
поделиться

10 ответов

Поскольку вас интересует только количество слов, и вас не интересуют отдельные слова, String.Split можно было бы избежать. String.Split удобен, но он излишне генерирует (потенциально) большое количество объектов String, что, в свою очередь, создает ненужную нагрузку на сборщик мусора. Для каждого слова в вашем тексте необходимо создать экземпляр нового объекта String, а затем скоро его собрать, так как вы его не используете.

Для домашнего задания это может не иметь значения, но если ваш текст содержимое ящика меняется часто, и вы делаете это вычисление внутри обработчика события, может быть разумнее просто перебирать символы вручную. Если вы действительно хотите использовать String.Split, перейдите к более простой версии, например Yonix .

В противном случае используйте алгоритм, подобный этому:

var text = richTextBox1.Text.Trim();
int wordCount = 0, index = 0;

while (index < text.Length)
{
   // check if current char is part of a word
   while (index < text.Length && !char.IsWhiteSpace(text[index]))
       index++;

   wordCount++;

   // skip whitespace until next word
   while (index < text.Length && char.IsWhiteSpace(text[index]))
       index++;
}

Этот код должен работать лучше, если у вас есть несколько пробелов между каждым словом.

16
ответ дан Community 18 August 2018 в 07:31
поделиться

Вы также можете сделать это таким образом! Добавьте этот метод к вашим методам расширения.

   public static int WordsCount(this string str)
    {
        return Regex.Matches(str, @"((\w+(\s?)))").Count;
    }

И назовите его так.

  string someString = "Let me show how I do it!";
  int wc = someString.WordsCount();
-1
ответ дан Akbar Khan 18 August 2018 в 07:31
поделиться
  • 1
    это дает неправильный ответ, если мы имеем несколько пробелов или «\r\n», linebreak между словами. – Artemious 20 December 2017 в 22:44
public static int WordCount(string str)
{        
    int num=0;
    bool wasInaWord=true;;

    if (string.IsNullOrEmpty(str))
    {
        return num;
    }

    for (int i=0;i< str.Length;i++)
    {
        if (i!=0)
        {
            if (str[i]==' ' && str[i-1]!=' ')
            {
                num++;
                wasInaWord=false;
            }
        } 
            if (str[i]!=' ')
            {
                wasInaWord=true;                
            }
    }
    if (wasInaWord)
    {
        num++;
    }
    return num;
}
0
ответ дан Anand Sanklipur 18 August 2018 в 07:31
поделиться
  • 1
    Пожалуйста, предоставьте некоторое объяснение кода в вашем ответе. – lu.koerfer 11 February 2017 в 02:16
char[] delimiters = new char[] {' ', '\r', '\n' };
whole_text.Split(delimiters,StringSplitOptions.RemoveEmptyEntries).Length;  
26
ответ дан Bedasso 18 August 2018 в 07:31
поделиться
  • 1
    Это было бы «есть лучшие способы сделать это». часть, о которой я упомянул в своем ответе;) +1. – Jason Down 9 January 2012 в 08:35
  • 2
    +1 для RemoveEmptyEntries. Это имеет значение, если в строке есть несколько пробельных символов. – Groo 9 January 2012 в 08:46
  • 3
    – Olorunfemi Ajibulu 23 October 2018 в 11:17

Есть несколько лучших способов сделать это, но в соответствии с тем, что у вас есть, попробуйте следующее:

string whole_text = richTextBox1.Text;
string trimmed_text = whole_text.Trim();

// new line split here
string[] lines = trimmed_text.Split(Environment.NewLine.ToCharArray());

// don't need this here now...            
//string[] split_text = trimmed_text.Split(' ');

int space_count = 0;
string new_text = "";

Теперь сделайте две петли foreach. Один для каждой строки и один для подсчета слов внутри строк.

foreach (string line in lines)
{
    // Modify the inner foreach to do the split on ' ' here
    // instead of split_text
    foreach (string av in line.Split(' '))
    {
        if (av == "")
        {
            space_count++;
        }
        else
        {
            new_text = new_text + av + ",";
        }
    }
}

new_text = new_text.TrimEnd(',');

// use lines here instead of split_text
lines = new_text.Split(',');
MessageBox.Show(lines.Length.ToString());
}
4
ответ дан Jason Down 18 August 2018 в 07:31
поделиться

Ваш подход находится на правильном пути. Я бы сделал что-то вроде передачи свойства text richTextBox1 в метод. Это, однако, будет неточным, если ваш богатый текстовый поле форматирует HTML, поэтому вам нужно снять любые теги HTML до запуска подсчета слов:

public static int CountWords(string s)
    {
    int c = 0;
    for (int i = 1; i < s.Length; i++)
    {
        if (char.IsWhiteSpace(s[i - 1]) == true)
        {
        if (char.IsLetterOrDigit(s[i]) == true ||
            char.IsPunctuation(s[i]))
        {
            c++;
        }
        }
    }
    if (s.Length > 2)
    {
        c++;
    }
    return c;
}
0
ответ дан LewisBenge 18 August 2018 в 07:31
поделиться

Посмотрите на свойство Lines, указанное в комментарии @Jay Riggs, а также эту перегрузку String.Split , чтобы сделать код намного проще. Тогда самым простым подходом было бы перебрать каждую строку в свойстве Lines, называть String.Split на нем и добавить длину массива, который он возвращает, к текущему счету.

EDIT: Кроме того, есть ли причина, по которой вы используете RichTextBox вместо TextBox с Multiline, установленным на True?

1
ответ дан Matt Sieker 18 August 2018 в 07:31
поделиться

Это должно работать

input.Split(' ').ToList().Count;
0
ответ дан N Jay 18 August 2018 в 07:31
поделиться

Мы использовали адаптированную форму ответа Йоши, где мы исправили ошибку, где она не учитывала бы последнее слово в строке, если после него не было белого пробела:

public static int CountWords(string test)
{
  int count = 0;
  bool inWord = false;

  foreach (char t in test)
  {
    if (char.IsWhiteSpace(t))
    {
      inWord = false;
    }
    else
    {
      if (!inWord) count++;
      inWord = true;
    }
  }
  return count;
}
0
ответ дан StefanM 18 August 2018 в 07:31
поделиться

Это был вопрос интервью с экраном, который я только что взял (крупной компанией, расположенной в ЦА, которая продает все виды устройств, которые начинаются с буквы «i»), и я думаю, что я откровенно ... после того, как я вышел в оффлайн , Я написал это. Мне жаль, что я не смог это сделать во время интервью ..

static void Main(string[] args)
{
    Debug.Assert(CountWords("Hello world") == 2);
    Debug.Assert(CountWords("    Hello world") == 2);
    Debug.Assert(CountWords("Hello world    ") == 2);
    Debug.Assert(CountWords("Hello      world") == 2);
}

public static int CountWords(string test)
{
    int count = 0;
    bool wasInWord = false;
    bool inWord = false;

    for (int i = 0; i < test.Length; i++)
    {
        if (inWord)
        {
            wasInWord = true;
        }

        if (Char.IsWhiteSpace(test[i]))
        {
            if (wasInWord)
            {
                count++;
                wasInWord = false;
            }
            inWord = false;
        }
        else
        {
            inWord = true;
        }
    }

    // Check to see if we got out with seeing a word
    if (wasInWord)
    {
        count++;
    }

    return count;
}
2
ответ дан Yoshi 18 August 2018 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: