以下NSString
类别方法的简单实现是什么,它返回中的单词数self
,其中单词由任意数量的连续空格或换行符分隔?此外,字符串将少于 140 个字符,因此在这种情况下,我更喜欢简单性和可读性,但会牺牲一点性能。
@interface NSString (Additions)
- (NSUInteger)wordCount;
@end
我找到了以下解决方案:
但是,没有更简单的方法吗?
以下NSString
类别方法的简单实现是什么,它返回中的单词数self
,其中单词由任意数量的连续空格或换行符分隔?此外,字符串将少于 140 个字符,因此在这种情况下,我更喜欢简单性和可读性,但会牺牲一点性能。
@interface NSString (Additions)
- (NSUInteger)wordCount;
@end
我找到了以下解决方案:
但是,没有更简单的方法吗?
为什么不只做以下事情?
- (NSUInteger)wordCount {
NSCharacterSet *separators = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSArray *words = [self componentsSeparatedByCharactersInSet:separators];
NSIndexSet *separatorIndexes = [words indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
return [obj isEqualToString:@""];
}];
return [words count] - [separatorIndexes count];
}
我相信您已经确定了“最简单的”。不过,要回答您的原始问题 - “以下 NSString类别的简单实现......”,并将其直接发布在此处以供后代使用:
@implementation NSString (GSBString)
- (NSUInteger)wordCount
{
__block int words = 0;
[self enumerateSubstringsInRange:NSMakeRange(0,self.length)
options:NSStringEnumerationByWords
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {words++;}];
return words;
}
@end
有许多更简单的实现,但它们都有权衡。例如,Cocoa(但不是 Cocoa Touch)具有字数统计功能:
- (NSUInteger)wordCount {
return [[NSSpellChecker sharedSpellChecker] countWordsInString:self language:nil];
}
像扫描仪一样准确地计算单词也很简单,只需使用[[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] count]
. 但是我发现对于较长的字符串,该方法的性能会大大降低。
所以这取决于你想要做出的权衡。我发现绝对最快的就是直接进入ICU。如果您想要最简单,使用现有代码可能比编写任何代码都简单。
- (NSUInteger) wordCount
{
NSArray *words = [self componentsSeparatedByString:@" "];
return [words count];
}
看起来我在问题中给出的第二个链接仍然不仅是最快的,而且事后看来,它还是一个相对简单的 -[NSString wordCount] 实现。
Objective-C 单行版本
NSInteger wordCount = word ? ([word stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet.invertedSet].length + 1) : 0;
斯威夫特 3:
let words: [Any] = (string.components(separatedBy: " "))
let count = words.count