在不使用正则表达式的情况下,在NSString中计算单词数量的最有效方法是什么?

Uni*_*orn 1 cocoa objective-c nsstring ios

我对Objective C有点新意,并想知道是否有更好的方法来计算字符串中的单词.

即:

NSString *str = @"this is a string";

// return should be 4 words ..
Run Code Online (Sandbox Code Playgroud)

我现在如何做的方法是将字符串分解为单词space('')字符数组并计算数组.

任何建议将不胜感激!谢谢!!:)

编辑:对于那些来这里寻找答案的人; 我发现了一篇类似的帖子,回复非常好.

如何计算文本字符串中的单词?

Pet*_*sey 6

有两种方法不涉及收集一系列单词,并且应该比仅仅打破空格更聪明:

即使我确实想收集或以其他方式使用这些词,我也会使用其中一种.


zou*_*oul 5

您确定在该部分代码中存在瓶颈吗?如果不是(这很可能),那么拆分空间似乎完全可以接受.您可以创建一个C字符串并计算空格,但很多时候这样的"优化"版本实际上比原始版本慢.也就是说,假设您当前的代码如下所示:

NSUInteger wordCount = [[someString componentsSeparatedByString:@" "] count];
Run Code Online (Sandbox Code Playgroud)

这不完全正确(请参阅@"___"下划线是一个空格),但也许您真的使用正则表达式并拆分\s+


pax*_*blo 5

除非你每秒要做几百次,否则我会选择可读的解决方案,类似于下面的伪代码:

def count (str):
    lastchar = " "
    count = 0
    for char as every character in string:
        if char is not whitespace and lastchar is whitespace:
            count = count + 1
        lastchar = char
    return count
Run Code Online (Sandbox Code Playgroud)

创建一个完整的其他字符串数组似乎有点浪费,所以你可以计算它们并扔掉它们.

如果由于某种原因,它成为一个问题,你可以用更快的版本替换函数体.但首先要确保它一个问题.优化代码已经足够快就是浪费精力.


NSR*_*der 5

在这种情况下,我会像这样使用NSScanner:

NSString *str = @"this is a string";
NSScanner *scanner = [NSScanner scannerWithString:str];
NSCharacterSet *whiteSpace = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSCharacterSet *nonWhitespace = [whiteSpace invertedSet];
int wordcount = 0;

while(![scanner isAtEnd])
{
    [scanner scanUpToCharactersFromSet:nonWhitespace intoString:nil];
    [scanner scanUpToCharactersFromSet:whitespace intoString:nil];
    wordcount++;
}
Run Code Online (Sandbox Code Playgroud)

这只会创建两个额外的对象,无论字符串有多长.