サブアレイが条件を満たすアレイでカウントを行いたい。 私はこれを行うことができると思ったが、できなかった。条件付きnsarrayカウント
NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[obj objectAtIndex:4] isEqualToString:@"1"];
}] count]);
サブアレイが条件を満たすアレイでカウントを行いたい。 私はこれを行うことができると思ったが、できなかった。条件付きnsarrayカウント
NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[obj objectAtIndex:4] isEqualToString:@"1"];
}] count]);
enumerateObjectsUsingBlock:
は何も返しません。私はそのコードがコンパイルされていないと確信しています(あなたのコメントが述べるように、自動補完は機能しません - そうすべきではありません)。
NSArrayのindexesOfObjectsPassingTest:
を使用して、NSIndexSet
のcount
を使用してください。
bbumが正しくあります。 indexesOfObjectsPassingTestを使用してください。それはより簡単です。
しかし、あなたはこのように、テスト通行人をカウントする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の答えをチェックする必要があります - しかし、私はあまりにもブロック機能で新たなんだ、とパズルを高く評価)
詳細;ブロックの外側にある '__block NSUInteger count = 0;'を使い、テストをパスすると内部でインクリメントします。配列を作成するより効率的です。 NSIndexSetを作成するより効率的であるかどうかは、テスト(__blockにはオーバーヘッドがあり、NSIndexSetは非常に安い)によってのみ解決できます。 – bbum
+1これは、スタックオーバーフローが受け入れられたもの以外の複数の回答を可能にする理由です。 –
It's faster to use a for loop(及び、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;
}
NSLog
には、適切な%lu
フォーマットと(unsigned long)
タイプを使用しました。 %d
は説明的ではなく、doesn't act the same in all scenariosです。
どうしたらうまくいかないのですか?どんな結果が期待できますか、そしてあなたの入力データは何ですか? – pmdj
カウントはコードの自動補完には現れず、「無効な受信者タイプ 'void'」というエラーが表示されます。 – Darren