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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在不使用正则表达式的情况下,在NSString中计算单词数量的最有效方法是什么?相关的知识,希望对你有一定的参考价值。

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

即:

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

// return should be 4 words ..

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

任何建议将被认真考虑!谢谢!! :)

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

How to count words within a text string?

答案

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

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

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

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

另一答案

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

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

另一答案

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

NSUInteger wordCount = [[someString componentsSeparatedByString:@" "] count];

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

另一答案

在这种情况下,我会像这样使用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++;
}

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

另一答案

用于将字符串存储到数组中

NSArray *yourArray = [str componentsSeparatedByString:@" "];

更新:

并且不计算你可以使用的单词

[yourArray count]
另一答案

此代码将计算字符串中包含的由任意数量的空格或换行符分隔的单词数(即非空子串):

NSUInteger wordCount = 0;

for (NSString* word in [someString
    componentsSeparatedByCharactersInSet:
    [NSMutableCharacterSet characterSetWithCharactersInString:@" 
"]]) {

    if (![word  isEqual: @""]) {
        wordCount++;
    }

}

对于zoul的回答,这是一个小小的改进,而不会再出现正则表达式。

另一答案

单线精确解决方案:

return [[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]].count;

以上是关于在不使用正则表达式的情况下,在NSString中计算单词数量的最有效方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用正则表达式的情况下,判断一个字符是 Java 中的字母还是数字的最佳方法是啥?

我可以在不抛出异常的情况下测试正则表达式在 C# 中是不是有效吗

如何在不编写正则表达式的情况下从字符串中解析日期?

在不编码的情况下将 NSData 转换为 NSString

在没有正则表达式的情况下验证具有不同格式的电话号码

在不知道编码类型的情况下将 NSData 转换为 NSString