我对Objective C有点新意,并想知道是否有更好的方法来计算字符串中的单词。
即:
NSString *str = @"this is a string";
// return should be 4 words ..
我现在如何做的方法是将字符串分解为单词space('')字符数组并计算数组。
任何建议将不胜感激!谢谢!! :)
编辑: 对于那些来这里寻找答案的人;我发现了一篇类似的帖子,回复非常好。
答案 0 :(得分:6)
有两种方法不涉及收集一系列单词,而且应该比打破空格更聪明:
enumerateSubstringsInRange:options:usingBlock:
method。在iOS 4.0中引入Cocoa Touch。即使我确实想收集或以其他方式使用这些词,我也会使用其中一种。
答案 1 :(得分:5)
您确定在该部分代码中存在瓶颈吗?如果不是(这很可能),那么拆分空间似乎完全可以接受。您可以创建一个C字符串并计算空格,但很多时候这样的“优化”版本实际上比原始版本慢。也就是说,假设您当前的代码如下所示:
NSUInteger wordCount = [[someString componentsSeparatedByString:@" "] count];
这不完全正确(请参阅@"___"
下划线是一个空格),但也许您真的使用正则表达式并在\s+
上拆分?
答案 2 :(得分: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
创建一整套其他字符串似乎有点浪费,这样你就可以计算它们并把它们扔掉。
如果由于某种原因,它成为一个问题,你可以用更快的版本替换函数体。但请确保 首先出现问题。优化代码的速度已经足够快了。
答案 3 :(得分: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++;
}
这只会创建两个额外的对象,无论字符串有多长。
答案 4 :(得分:1)
用于将字符串存储到数组
NSArray *yourArray = [str componentsSeparatedByString:@" "];
<强>更新强>
并且不计算任何单词,你可以使用
[yourArray count]
答案 5 :(得分:1)
此代码将计算字符串中包含的单词数(即非空子串),这些单词由任意数量的空格或换行符字符分隔:
NSUInteger wordCount = 0;
for (NSString* word in [someString
componentsSeparatedByCharactersInSet:
[NSMutableCharacterSet characterSetWithCharactersInString:@" \n"]]) {
if (![word isEqual: @""]) {
wordCount++;
}
}
对于zoul的答案,这是一个小小的改进,而不会再出现在正则表达式中。
答案 6 :(得分:0)
一个班轮准确的解决方案:
return [[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]].count;