2012-04-14 26 views
2

サブアレイが条件を満たすアレイでカウントを行いたい。 私はこれを行うことができると思ったが、できなかった。条件付きnsarrayカウント

NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
      [[obj objectAtIndex:4] isEqualToString:@"1"]; 
     }] count]); 
+0

どうしたらうまくいかないのですか?どんな結果が期待できますか、そしてあなたの入力データは何ですか? – pmdj

+0

カウントはコードの自動補完には現れず、「無効な受信者タイプ 'void'」というエラーが表示されます。 – Darren

答えて

8

enumerateObjectsUsingBlock:は何も返しません。私はそのコードがコンパイルされていないと確信しています(あなたのコメントが述べるように、自動補完は機能しません - そうすべきではありません)。

NSArrayのindexesOfObjectsPassingTest: を使用して、NSIndexSetcountを使用してください。

Documented here.

+0

indexOfObjectPassingTestは最初のオカレンスを返します。 – Darren

+0

@Darren - 答えにタイプミス、代わりにインデックス... – jrturton

+0

右。複数の方法があります:インデックス** es ** OfObject ** s ** PassingTest。 NSIndex ** Set **を返します。 – Wienke

2

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の答えをチェックする必要があります - しかし、私はあまりにもブロック機能で新たなんだ、とパズルを高く評価)

+2

詳細;ブロックの外側にある '__block NSUInteger count = 0;'を使い、テストをパスすると内部でインクリメントします。配列を作成するより効率的です。 NSIndexSetを作成するより効率的であるかどうかは、テスト(__blockにはオーバーヘッドがあり、NSIndexSetは非常に安い)によってのみ解決できます。 – bbum

+0

+1これは、スタックオーバーフローが受け入れられたもの以外の複数の回答を可能にする理由です。 –

0

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です。