返回objectForKey的数量

时间:2013-02-03 15:19:22

标签: iphone ios uitableview nsarray nsdictionary

我的代码中有一部分返回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,而应记录数字2,因为只有2 "PlayStation 3"

请帮忙。

3 个答案:

答案 0 :(得分:2)

您无需显式循环遍历数组。

NSIndexSet *is = [array indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    return [[obj objectForKey:@"model"] isEqualToString:@"PlayStation 3"];
}];
int numOfPS3s = is.count;

答案 1 :(得分:1)

  1. 正在记录数字5,因为每个词典中有5个键(consolegameidmodel,{{1 }})。如果不是记录publisher,而是每次只需在[consoleDictionary count]计数器中添加一个,那么您最终会在计数器中获得预期结果。

  2. 您可以更轻松地获取对象数量:int是数组

  3. 典型地:

    [self arrayFromJSON]

答案 2 :(得分:1)

是的,count始终是总计数,而不是索引,而不是匹配计数。使用indexesOfObjectsPassingTest是这个特定问题的最直接的解决方案,但如果您对迭代结果集的其他技术感兴趣,而且不仅要跟踪对象,还要跟踪索引,请考虑这两个方法也是如此:

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);
    }
}];

显然,如果您正在寻找匹配的记录数,那么您只需增加自己的计数器,而不是记录每次匹配的索引。