我的代码中有一部分返回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"
。
请帮忙。
答案 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)
正在记录数字5,因为每个词典中有5个键(console
,game
,id
,model
,{{1 }})。如果不是记录publisher
,而是每次只需在[consoleDictionary count]
计数器中添加一个,那么您最终会在计数器中获得预期结果。
您可以更轻松地获取对象数量:int
是数组
典型地:
[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);
}
}];
显然,如果您正在寻找匹配的记录数,那么您只需增加自己的计数器,而不是记录每次匹配的索引。