【发布时间】:2010-02-15 14:10:41
【问题描述】:
在 iOS 上,如何计算特定文本字符串中的字数?
【问题讨论】:
标签: ios objective-c nsstring
在 iOS 上,如何计算特定文本字符串中的字数?
【问题讨论】:
标签: ios objective-c nsstring
比拆分更有效的方法是逐字符检查字符串。
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's solution相比,计算一个1,000,000字的字符串需要:
我的方法的最大缺点是它不是单行的。
【讨论】:
[[stringToCOunt componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceCharacterSet] count]
【讨论】:
[[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 场会议的视频:Douglas Davidson 的文本和语言分析
【讨论】:
一个线性精确的解决方案:
return [[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]].count;
此解决方案正确处理连续空格。
【讨论】: