在不使用正则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;