Как считать слова в текстовой строке? - PullRequest
1 голос
/ 15 февраля 2010

В iOS как подсчитать слова в определенной текстовой строке?

Ответы [ 4 ]

7 голосов
/ 15 февраля 2010

Более эффективный метод, чем разделение, - проверять строку символ за символом.

int word_count(NSString* s) {
  CFCharacterSetRef alpha = CFCharacterSetGetPredefined(kCFCharacterSetAlphaNumeric);
  CFStringInlineBuffer buf;
  CFIndex len = CFStringGetLength((CFStringRef)s);
  CFStringInitInlineBuffer((CFStringRef)s, &buf, CFRangeMake(0, len));
  UniChar c;
  CFIndex i = 0;
  int word_count = 0;
  Boolean was_alpha = false, is_alpha;
  while (c = CFStringGetCharacterFromInlineBuffer(&buf, i++)) {
    is_alpha = CFCharacterSetIsCharacterMember(alpha, c);
    if (!is_alpha && was_alpha)
      ++ word_count;
    was_alpha = is_alpha;
  }
  if (is_alpha)
    ++ word_count;
  return word_count;
}

По сравнению с решением @ ennuikiller подсчет строки из 1 000 000 слов занимает:

  • 0,19 секунды, чтобы построить строку
  • 0,39 секунды, чтобы построить строку + подсчет, используя мой метод.
  • 1,34 секунды для построения строки + подсчет по методу ennuikiller.

Большим недостатком моего метода является то, что он не является однострочным.

4 голосов
/ 15 февраля 2010
 [[stringToCOunt componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceCharacterSet] count]
2 голосов
/ 01 февраля 2013

Я думаю, что этот метод лучше:

__block int wordCount = 0;
NSRange range = {0,self.text.length };
[self.text enumerateSubstringsInRange:range options:NSStringEnumerationByWords usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    wordCount++;
}];

В качестве справочного материала проверьте видео на 215-й сессии WWDC 2012: текстовый и лингвистический анализ Дугласа Дэвидсона

0 голосов
/ 23 сентября 2015

Одно линейное точное решение:

return [[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]].count;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...