8

NSStringの単語数を返す次のカテゴリ メソッドの簡単な実装は何ですかself。単語は任意の数の連続するスペースまたは改行文字で区切られています。また、文字列は 140 文字未満になるため、この場合はパフォーマンスを少し犠牲にしてシンプルさと読みやすさを優先します。

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

次の解決策が見つかりました。

しかし、もっと簡単な方法はありませんか?

4

7 に答える 7

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];
}
于 2011-05-30T00:59:42.867 に答える
11

「最も単純な」ものを特定したと思います。それにもかかわらず、元の質問-「次の 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
于 2014-09-14T01:42:53.920 に答える
9

より単純な実装がいくつかありますが、それらにはすべてトレードオフがあります。たとえば、Cocoa (Cocoa Touch ではない) には単語カウントが組み込まれています。

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

を使用するだけで、スキャナーと同じくらい正確に単語を数えることも簡単[[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] count]です。しかし、そのメソッドのパフォーマンスは、長い文字列では大幅に低下することがわかりました。

したがって、それはあなたがしたいトレードオフに依存します。ICUに直行するのが絶対的な最速であることがわかりました。最も単純にしたい場合は、既存のコードを使用する方が、コードをまったく書くよりもおそらく簡単です。

于 2011-05-30T01:03:12.100 に答える
4
- (NSUInteger) wordCount
{
   NSArray *words = [self componentsSeparatedByString:@" "];
   return [words count];
}
于 2011-05-30T01:02:11.997 に答える
1

私の質問で私が与えた2番目のリンクは、最速であるだけでなく、後から考えると -[NSString wordCount] の比較的単純な実装としても支配しているようです。

于 2011-05-30T02:46:41.190 に答える
0

スウィフト 3:

let words: [Any] = (string.components(separatedBy: " "))
let count = words.count
于 2017-09-14T17:44:36.013 に答える