以下NSString
類別方法的簡單實現是什麼?返回self
中的單詞數量,其中單詞由任意數量的連續空格或換行符分隔?此外,該字符串將少於140個字符,因此在這種情況下,我傾向於簡單易讀,而犧牲一點性能。Objective-C: - [NSString wordCount]
@interface NSString (Additions)
- (NSUInteger)wordCount;
@end
我發現了以下解決方案:
但是,是不是有一個更簡單的方法?
以下NSString
類別方法的簡單實現是什麼?返回self
中的單詞數量,其中單詞由任意數量的連續空格或換行符分隔?此外,該字符串將少於140個字符,因此在這種情況下,我傾向於簡單易讀,而犧牲一點性能。Objective-C: - [NSString wordCount]
@interface NSString (Additions)
- (NSUInteger)wordCount;
@end
我發現了以下解決方案:
但是,是不是有一個更簡單的方法?
看起來我在我的問題中給出的第二個鏈接不僅是最快的,而且在事後看來還是一個相對簡單的implementation of -[NSString wordCount]。
單詞的定義不可用此實現進行定製。 – 2015-09-22 11:14:12
爲什麼不只是做下面的事情?
- (NSUInteger)wordCount {
NSCharacterSet *separators = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSArray *words = [self componentsSeparatedByCharactersInSet:separators];
NSIndexSet *separatorIndexes = [words indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
return [obj isEqualToString:@""];
}];
return [words count] - [separatorIndexes count];
}
謝謝!這看起來完全正確和簡單。我想知道它是否有效。雖然我在構建一個iOS應用程序,而不是操作系統,但在我的情況下足夠好。 :) 我喜歡! – ma11hew28 2011-05-30 01:03:01
嗯..我不認爲這是完全正確的。根據Xcode文檔:「相鄰的分隔符字符會在結果中產生空字符串,類似地,如果字符串以分隔符開始或結尾,則第一個或最後一個子字符串分別爲空。」我不想將空字符串計爲單詞。例如,該方法應該爲'@「hello」'返回1,而不是3. – ma11hew28 2011-05-30 01:16:49
不錯!有用!我也證實了我在網上找到的另一種解決方案的正確性,它看起來大約是實施的兩倍,而且還相當簡單。所以,[我發佈它作爲答案](http://stackoverflow.com/questions/6171422/objective-c-nsstring-wordcount/6171849#6171849)。 – ma11hew28 2011-05-30 02:51:00
- (NSUInteger) wordCount
{
NSArray *words = [self componentsSeparatedByString:@" "];
return [words count];
}
如果您有空間或換行符的運行,這會超過計數。 – Obliquely 2012-12-17 19:43:36
多個空格或多個換行符「@」\ n \ n \ n「'錯誤計數。請參閱上面的正確解決方案:http://stackoverflow.com/a/6171439/1033581 – 2015-09-23 01:41:11
有一些簡單的實現,但它們都具有權衡。例如,可可(但不是可可觸摸)的字計數的出爐:
- (NSUInteger)wordCount {
return [[NSSpellChecker sharedSpellChecker] countWordsInString:self language:nil];
}
這也是微不足道盡可能準確計算單詞作爲掃描儀簡單地使用[[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] count]
。但是我發現該方法的性能對於較長的字符串而言會降低很多。
所以這取決於你想要做的折衷。我發現絕對最快的只是直接去ICU。如果你想最簡單,使用現有的代碼可能比編寫任何代碼更簡單。
我相信你已經確定了'最簡單'。不過,爲了回答你原來的問題 - 「一個簡單的實現以下的NSString 類的......」,並將它直接貼在這裏爲後人:
@implementation NSString (GSBString)
- (NSUInteger)wordCount
{
__block int words = 0;
[self enumerateSubstringsInRange:NSMakeRange(0,self.length)
options:NSStringEnumerationByWords
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {words++;}];
return words;
}
@end
一個詞的定義是不可定製的這個實現。 – 2015-09-23 02:05:50
@Cœur,但有語言沒有空格。 – 2015-12-14 12:36:48
斯威夫特3:
let words: [Any] = (string.components(separatedBy: " "))
let count = words.count
我不明白在這裏如何做到比線性搜索更好。根據scanUpToCharactersFromSet的實現,在大多數情況下,這可能比O(n)好。 – tjarratt 2011-05-30 00:58:55
@tjarratt:我認爲OP想要「最簡單」的方法,不一定是最快的。 – 2011-05-30 01:01:42
如何通過單詞枚舉和通過在字符串枚舉中使用NSStringEnumerationByWords進行計數? – 2014-10-30 20:44:23