サブ配列が条件を満たす配列をカウントしたい。できると思ったのですが、できません。
NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[obj objectAtIndex:4] isEqualToString:@"1"];
}] count]);
サブ配列が条件を満たす配列をカウントしたい。できると思ったのですが、できません。
NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[obj objectAtIndex:4] isEqualToString:@"1"];
}] count]);
enumerateObjectsUsingBlock:
何も返しません。コードはコンパイルさえしないに違いない (そして、あなたのコメントが述べているように、オートコンプリートは機能しません - そしてそうすべきではありません)。
NSArray を使用して、結果のindexesOfObjectsPassingTest:
を取得します。count
NSIndexSet
bbumは正しいです。indexOfObjectsPassingTestを使用する必要があります。それはもっと簡単です。
ただし、次のように、テスト合格者をカウントするために使用できます。enumerateObjectsUsingBlock
NSArray *sections = [NSArray arrayWithObjects:@"arb", @"1", @"misc", @"1", @"extra", nil];
NSMutableArray *occurrencesOf1 = [NSMutableArray array];
[sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([(NSString*)obj isEqualToString:@"1"])
[occurrencesOf1 addObject:obj];
}];
NSLog(@"%d", [occurrencesOf1 count]); // prints 2
余分な可変配列が必要になるため、非効率的です。
(したがって、受け入れられたものとしてbbumの答えを確認する必要がありますが、私はブロック機能も初めてで、パズルに感謝しています。)
forループを使用する方が高速です(そして、IMO、より読みやすくなります):
NSLog(@"%lu", (unsigned long)[self countSectionsWithValue:@"1" atIndex:4]);
// ...
}
// ...
- (NSUInteger) countSectionsWithValue:(NSString *)value atIndex:(NSInteger)idx
{
NSUInteger count = 0
for (id section in _sections)
{
if ([[section objectAtIndex:idx] isEqualToString:value])
{
count++;
}
}
return count;
}
%lu
また、適切な形式と(unsigned long)
タイプを使用したことにも注意してくださいNSLog
。%d
説明的ではなく、すべてのシナリオで同じように動作するわけではありません。