NSString
の単語数を返す次のカテゴリ メソッドの簡単な実装は何ですかself
。単語は任意の数の連続するスペースまたは改行文字で区切られています。また、文字列は 140 文字未満になるため、この場合はパフォーマンスを少し犠牲にしてシンプルさと読みやすさを優先します。
@interface NSString (Additions)
- (NSUInteger)wordCount;
@end
次の解決策が見つかりました。
しかし、もっと簡単な方法はありませんか?
NSString
の単語数を返す次のカテゴリ メソッドの簡単な実装は何ですかself
。単語は任意の数の連続するスペースまたは改行文字で区切られています。また、文字列は 140 文字未満になるため、この場合はパフォーマンスを少し犠牲にしてシンプルさと読みやすさを優先します。
@interface NSString (Additions)
- (NSUInteger)wordCount;
@end
次の解決策が見つかりました。
しかし、もっと簡単な方法はありませんか?
なぜ次のことをしないのですか?
- (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];
}
「最も単純な」ものを特定したと思います。それにもかかわらず、元の質問-「次の 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
より単純な実装がいくつかありますが、それらにはすべてトレードオフがあります。たとえば、Cocoa (Cocoa Touch ではない) には単語カウントが組み込まれています。
- (NSUInteger)wordCount {
return [[NSSpellChecker sharedSpellChecker] countWordsInString:self language:nil];
}
を使用するだけで、スキャナーと同じくらい正確に単語を数えることも簡単[[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] count]
です。しかし、そのメソッドのパフォーマンスは、長い文字列では大幅に低下することがわかりました。
したがって、それはあなたがしたいトレードオフに依存します。ICUに直行するのが絶対的な最速であることがわかりました。最も単純にしたい場合は、既存のコードを使用する方が、コードをまったく書くよりもおそらく簡単です。
- (NSUInteger) wordCount
{
NSArray *words = [self componentsSeparatedByString:@" "];
return [words count];
}
私の質問で私が与えた2番目のリンクは、最速であるだけでなく、後から考えると -[NSString wordCount] の比較的単純な実装としても支配しているようです。
スウィフト 3:
let words: [Any] = (string.components(separatedBy: " "))
let count = words.count