2011-05-30 32 views
5

以下NSString類別方法的簡單實現是什麼?返回self中的單詞數量,其中單詞由任意數量的連續空格或換行符分隔?此外,該字符串將少於140個字符,因此在這種情況下,我傾向於簡單易讀,而犧牲一點性能。Objective-C: - [NSString wordCount]

@interface NSString (Additions) 
- (NSUInteger)wordCount; 
@end 

我發現了以下解決方案:

但是,是不是有一個更簡單的方法?

+1

我不明白在這裏如何做到比線性搜索更好。根據scanUpToCharactersFromSet的實現,在大多數情況下,這可能比O(n)好。 – tjarratt 2011-05-30 00:58:55

+0

@tjarratt:我認爲OP想要「最簡單」的方法,不一定是最快的。 – 2011-05-30 01:01:42

+0

如何通過單詞枚舉和通過在字符串枚舉中使用NSStringEnumerationByWords進行計數? – 2014-10-30 20:44:23

回答

1

看起來我在我的問題中給出的第二個鏈接不僅是最快的,而且在事後看來還是一個相對簡單的implementation of -[NSString wordCount]

+0

單詞的定義不可用此實現進行定製。 – 2015-09-22 11:14:12

15

爲什麼不只是做下面的事情?

- (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]; 
} 
+0

謝謝!這看起來完全正確和簡單。我想知道它是否有效。雖然我在構建一個iOS應用程序,而不是操作系統,但在我的情況下足夠好。 :) 我喜歡! – ma11hew28 2011-05-30 01:03:01

+0

嗯..我不認爲這是完全正確的。根據Xcode文檔:「相鄰的分隔符字符會在結果中產生空字符串,類似地,如果字符串以分隔符開始或結尾,則第一個或最後一個子字符串分別爲空。」我不想將空字符串計爲單詞。例如,該方法應該爲'@「hello」'返回1,而不是3. – ma11hew28 2011-05-30 01:16:49

+0

不錯!有用!我也證實了我在網上找到的另一種解決方案的正確性,它看起來大約是實施的兩倍,而且還相當簡單。所以,[我發佈它作爲答案](http://stackoverflow.com/questions/6171422/objective-c-nsstring-wordcount/6171849#6171849)。 – ma11hew28 2011-05-30 02:51:00

3
- (NSUInteger) wordCount 
{ 
    NSArray *words = [self componentsSeparatedByString:@" "]; 
    return [words count]; 
} 
+1

如果您有空間或換行符的運行,這會超過計數。 – Obliquely 2012-12-17 19:43:36

+0

多個空格或多個換行符「@」\ n \ n \ n「'錯誤計數。請參閱上面的正確解決方案:http://stackoverflow.com/a/6171439/1033581 – 2015-09-23 01:41:11

8

有一些簡單的實現,但它們都具有權衡。例如,可可(但不是可可觸摸)的字計數的出爐:

- (NSUInteger)wordCount { 
    return [[NSSpellChecker sharedSpellChecker] countWordsInString:self language:nil]; 
} 

這也是微不足道盡可能準確計算單詞作爲掃描儀簡單地使用[[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] count]。但是我發現該方法的性能對於較長的字符串而言會降低很多。

所以這取決於你想要做的折衷。我發現絕對最快的只是直接去ICU。如果你想最簡單,使用現有的代碼可能比編寫任何代碼更簡單。

8

我相信你已經確定了'最簡單'。不過,爲了回答你原來的問題 - 「一個簡單的實現以下的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 
+0

一個詞的定義是不可定製的這個實現。 – 2015-09-23 02:05:50

+0

@Cœur,但有語言沒有空格。 – 2015-12-14 12:36:48

0

斯威夫特3:

let words: [Any] = (string.components(separatedBy: " ")) 
let count = words.count