如何计算文本字符串中的单词?

在iOS上,如何计算特定文本字符串中的单词?

比分割更有效的方法是逐字符检查字符串。

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的方法构建字符串+计数。

我的方法的一大缺点是它不是一个单行。

  [[stringToCOunt componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceCharacterSet] count] 

我认为这种方法更好:

 __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++; }]; 

作为参考,请查看WWDC 2012会话215的video:Douglas Davidson撰写的文本和语言分析

单线精确解决方案:

 return [[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]].count;