2

サブ配列が条件を満たす配列をカウントしたい。できると思ったのですが、できません。

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

3 に答える 3

8

enumerateObjectsUsingBlock:何も返しません。コードはコンパイルさえしないに違いない (そして、あなたのコメントが述べているように、オートコンプリートは機能しません - そしてそうすべきではありません)。

NSArray を使用して、結果のindexesOfObjectsPassingTest: を取得します。countNSIndexSet

ここに文書化されています。

于 2012-04-14T17:32:32.720 に答える
2

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の答えを確認する必要がありますが、私はブロック機能も初めてで、パズルに感謝しています。)

于 2012-04-14T17:46:25.203 に答える
0

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説明的ではなく、すべてのシナリオで同じように動作するわけではありません

于 2016-03-07T22:45:05.653 に答える