8

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

@interface NSString (Additions)
- (NSUInteger)wordCount;
@end

我找到了以下解决方案:

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

4

7 回答 7

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];
}
于 2011-05-30T00:59:42.867 回答
11

我相信您已经确定了“最简单的”。不过,要回答您的原始问题 - “以下 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
于 2014-09-14T01:42:53.920 回答
9

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

- (NSUInteger)wordCount {
    return [[NSSpellChecker sharedSpellChecker] countWordsInString:self language:nil];
}

像扫描仪一样准确地计算单词也很简单,只需使用[[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] count]. 但是我发现对于较长的字符串,该方法的性能会大大降低。

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

于 2011-05-30T01:03:12.100 回答
4
- (NSUInteger) wordCount
{
   NSArray *words = [self componentsSeparatedByString:@" "];
   return [words count];
}
于 2011-05-30T01:02:11.997 回答
1

看起来我在问题中给出的第二个链接仍然不仅是最快的,而且事后看来,它还是一个相对简单的 -[NSString wordCount] 实现

于 2011-05-30T02:46:41.190 回答
1

Objective-C 单行版本

NSInteger wordCount = word ? ([word stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet.invertedSet].length + 1) : 0;
于 2018-07-27T01:20:25.493 回答
0

斯威夫特 3:

let words: [Any] = (string.components(separatedBy: " "))
let count = words.count
于 2017-09-14T17:44:36.013 回答