我对Objective C有点新意,并想知道是否有更好的方法来计算字符串中的单词。
即:
NSString *str = @"this is a string";
// return should be 4 words ..
我现在如何做的方法是将字符串分解为单词space('')字符数组并计算数组。
任何建议将被认真考虑!谢谢!! :)
编辑:对于那些来这里寻找答案的人;我发现了一篇类似的帖子,回复非常好。
除非你每秒要做几百次,否则我会选择可读的解决方案,如下面的伪代码:
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
创建一个完整的其他字符串数组似乎有点浪费,所以你可以计算它们并扔掉它们。
如果由于某种原因,它成为一个问题,你可以用更快的版本替换函数体。但首先要确保它是一个问题。优化代码已经足够快就是浪费精力。
有两种方法不涉及收集一系列单词,并且应该比仅仅打破空格更聪明:
enumerateSubstringsInRange:options:usingBlock:
method。在iOS 4.0中引入Cocoa Touch。即使我确实想收集或以其他方式使用这些词,我也会使用其中一种。
您确定在该部分代码中存在瓶颈吗?如果不是(这很可能),那么拆分空间似乎完全可以接受。您可以创建一个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:@" \n"]]) {
if (![word isEqual: @""]) {
wordCount++;
}
}
对于zoul的回答,这是一个小小的改进,而不会再出现正则表达式。
单线精确解决方案:
return [[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]].count;