Objective-C: - [NSString wordCount]

ma1*_*w28 6 objective-c nsstring word-count

什么是以下NSString类别方法的简单实现,它返回单词的数量self,其中单词由任意数量的连续空格或换行符分隔?此外,字符串将少于140个字符,因此在这种情况下,我更喜欢简单性和可读性,牺牲了一点性能.

@interface NSString (Additions)
- (NSUInteger)wordCount;
@end
Run Code Online (Sandbox Code Playgroud)

我找到了以下解决方案:

但是,有没有更简单的方法?

Sed*_*ien 15

为什么不做以下事情呢?

- (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];
}
Run Code Online (Sandbox Code Playgroud)


tir*_*tea 9

我相信你已经确定了'最简单'.然而,要回答你原来的问题 - "以下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
Run Code Online (Sandbox Code Playgroud)


Chu*_*uck 8

有许多更简单的实现,但它们都有权衡.例如,Cocoa(但不是Cocoa Touch)的字数统计在:

- (NSUInteger)wordCount {
    return [[NSSpellChecker sharedSpellChecker] countWordsInString:self language:nil];
}
Run Code Online (Sandbox Code Playgroud)

像扫描仪简单地使用一样精确计算单词也是微不足道的[[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] count].但我发现该方法的性能会因较长的字符串而降低很多.

所以这取决于你想要做出的权衡.我发现绝对最快的只是直接上ICU.如果您想要最简单,使用现有代码可能比编写任何代码更简单.


ma1*_*w28 1

看起来我在问题中给出的第二个链接仍然占据主导地位,不仅是最快的,而且事后看来,-[NSString wordCount] 的实现相对简单。