Objective c 目标C:-[NSString字数]

Objective c 目标C:-[NSString字数],objective-c,nsstring,word-count,Objective C,Nsstring,Word Count,下面的NSStringcategory方法返回self中的单词数,其中单词由任意数量的连续空格或换行符分隔,它的简单实现是什么?此外,字符串将少于140个字符,因此在这种情况下,我更喜欢简单易读,而牺牲了一点性能 @interface NSString (Additions) - (NSUInteger)wordCount; @end 我找到了以下解决方案: -看起来简单一点 但是,难道没有更简单的方法吗?为什么不做下面的事情呢 - (NSUInteger)wordCount {

下面的
NSString
category方法返回
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];
}

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

- (NSUInteger)wordCount {
    return [[NSSpellChecker sharedSpellChecker] countWordsInString:self language:nil];
}
只需使用
[[self components separatedbycharactersinset:[NSCharacterSet whitespaceAndNewlineCharacterSet]]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
Swift 3:

let words: [Any] = (string.components(separatedBy: " "))
let count = words.count

Objective-C单行程序版本

NSInteger wordCount = word ? ([word stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet.invertedSet].length + 1) : 0;

我看不出有什么可能比线性搜索做得更好。取决于ScanupCharactersFromSet的实现,在大多数情况下,这可能比O(n)更好。@tjarratt:我认为OP需要“最简单”的方法,而不一定是最快的方法。在字符串枚举中使用NSStringEnumerationByWords进行按字枚举和计数如何?可能是重复的,谢谢!这似乎完全正确且简单。我想知道它是否有效。就我而言,这已经足够好了,因为我正在构建一个iOS应用程序,而不是一个操作系统。:)我喜欢!隐马尔可夫模型。。我认为这并不完全正确。根据Xcode文档:“分隔符字符的相邻出现会在结果中产生空字符串。类似地,如果字符串以分隔符字符开头或结尾,则第一个或最后一个子字符串分别为空。”我不想将空字符串计为单词。例如,对于
@“hello”
,方法应该返回1,而不是3.nice!它起作用了!我还确认了我在网上找到的另一个解决方案的正确性,它的速度似乎是您的实现速度的两倍,而且仍然相当简单。因此,.如果您有空格或换行符,则此项会超过计数。多个空格或多个换行符的计数错误
@“\n\n\n”
。请参阅上面的正确解决方案:单词的定义不可使用此实现进行自定义。单词的定义不可使用此实现进行自定义。@Cœur但有些语言没有空格。
NSInteger wordCount = word ? ([word stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet.invertedSet].length + 1) : 0;