0

numberOfRowsInSection を返すコードの一部があります。

コード

for (NSDictionary *consoleDictionary in [self arrayFromJSON]) {
    if ([[consoleDictionary objectForKey:@"model"] isEqualToString:@"PlayStation 3"]) {
        NSLog(@"%@", consoleDictionary);
    }
}

出力

2013-02-03 22:37:08.468 PageControl01[5782:c07] {
    console = PlayStation;
    game = "007 Legends";
    id = 1;
    model = "PlayStation 3";
    publisher = "Electronic Arts";
}
2013-02-03 22:37:08.478 PageControl01[5782:c07] {
    console = PlayStation;
    game = "Ace Combat: Assault Horizon";
    id = 2;
    model = "PlayStation 3";
    publisher = Namco;
}

"PlayStation 3"これは、すべてのモデルをログに記録するため、明らかに正しいです。しかし、これは私が必要とするものではありません。の数を記録したい"PlayStation 3"。そのため、コードを少し調整してから、次のようにします。

for (NSDictionary *consoleDictionary in [self arrayFromJSON]) {
    if ([[consoleDictionary objectForKey:@"model"] isEqualToString:@"PlayStation 3"]) {
        NSLog(@"%d", [consoleDictionary count]);
    }
}

出力

2013-02-03 22:39:43.605 PageControl01[5816:c07] 5
2013-02-03 22:39:43.605 PageControl01[5816:c07] 5

これはかなり近いですが、とても近いです。数をログに記録する代わりに、数しかないため5、数をログに記録する必要があります。22 "PlayStation 3"

助けてください。

4

3 に答える 3

2

配列を明示的にループする必要はありません。

NSIndexSet *is = [array indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    return [[obj objectForKey:@"model"] isEqualToString:@"PlayStation 3"];
}];
int numOfPS3s = is.count;
于 2013-02-03T15:25:42.730 に答える
1
  1. console各辞書 ( 、gameid、 )modelに5 つのキーがあるため、番号 5 がログに記録されますpublisher。ログに記録する代わりに、毎回カウンター[consoleDictionary count]に 1 を追加するだけで、最後にカウンターに期待される結果が得られます。int

  2. オブジェクトの数は、はるかに簡単な方法で取得できます:[self arrayFromJSON]配列です

通常:

NSInteger nbPS3 = [[self arrayFromJSON] indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
  return [obj[@"model"] isEqualToString:@"PlayStation 3"];
}].count
于 2013-02-03T15:31:47.327 に答える
1

はい、countインデックスではなく、一致の数ではなく、常に合計数です。を使用するindexesOfObjectsPassingTestことがこの特定の質問に対する最も直接的な解決策ですが、結果セットを繰り返し処理するための他の手法に興味がある場合は、オブジェクトだけでなくインデックスも追跡する必要がある場合は、次の 2 つの方法も検討してください。

for (NSInteger i = 0; i < [self.arrayFromJSON count]; i++) {
    if ([[[self.arrayFromJSON objectAtIndex:i] objectForKey:@"model"] isEqualToString:@"PlayStation 3"]) {
        NSLog(@"%d", i);
    }
}

また

[self.arrayFromJSON enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([[obj objectForKey:@"model"] isEqualToString:@"PlayStation 3"]) {
        NSLog(@"%d", idx);
    }
}];

明らかに、一致するレコードの数を探している場合は、一致ごとにインデックスをログに記録するのではなく、独自のカウンターをインクリメントするだけです。

于 2013-02-03T15:35:20.607 に答える