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

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

即:

NSString *str = @"this is a string"; // return should be 4 words .. 

我现在怎么做的方法是把string分解成一个空格('')字符数组,并对数组进行计数。

任何意见将不胜感激! 谢谢!! 🙂

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

如何计算文本string中的单词?

除非你每秒要做数百次,否则我会select可读的解决scheme,如下面的伪代码:

 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 

创build一个其他string的整个数组似乎有点浪费,所以你可以把它们计数并扔掉。

如果出于某种原因,它成为一个问题,你可以用一个更快的版本replacefunction体。 首先确保它一个问题。 已经足够快的代码优化已经浪费了精力。

有两种方法不需要收集一些词汇,而应该比打破​​空格更聪明:

  • NSString的enumerateSubstringsInRange:options:usingBlock:方法 。 在iOS 4.0中引入Cocoa Touch。
  • CFStringTokenizer 。

我会使用其中的一个,即使我想要收集或以其他方式使用这些单词。

你确定你在这部分代码中有瓶颈吗? 如果不是(这很可能),那么在空间上分裂似乎是完全可以接受的。 你可以创build一个Cstring,并计算空格,但很多时候这样的“优化”版本实际上比原来的慢。 也就是说,假设你现在的代码如下所示:

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

这不完全正确(请参阅@"___" ,其中下划线是空格),但也许您真的使用正则expression式并在\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++; } 

这只会创build另外两个对象,不pipestring有多长。

用于将string存储到数组中

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

更新:

并计算你可以使用的字数

 [yourArray count] 

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

 NSUInteger wordCount = 0; for (NSString* word in [someString componentsSeparatedByCharactersInSet: [NSMutableCharacterSet characterSetWithCharactersInString:@" \n"]]) { if (![word isEqual: @""]) { wordCount++; } } 

zoul的答案略微有所改善,而不需要重复正则expression式。

一个class轮精确解决scheme

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