我有一个包含事件的字典。一个事件的格式如下所示
{
eventTime = 53';
eventType = "Yellow Card";
gameID = 0;
name = Mike;
selectedTeam = homeTeam;
}
我已将所有事件保存到NSMutableArray
。客户将随着时间的推移插入事件(对于足球比赛)。现在我需要检查填充我的UITableView
时,如果玩家有两张黄牌,那么我可以将图像更改为不同的图像。我现在这样做的方式看起来像这样,我不是真的喜欢它,它并没有真正起作用。
if ([typeEvent isEqualToString:@"Yellow Card"]){
int i= 0;
for (id obj in _events)
{
if ([[obj valueForKeyPath:[NSString stringWithFormat:@"eventType"]] isEqualToString:@"Yellow Card"] && [[obj valueForKeyPath:[NSString stringWithFormat:@"name"]] isEqualToString:[gameInfoObject valueForKeyPath:[NSString stringWithFormat:@"name"]]] ) {
i++;
if (i >= 2) {
imageType = [UIImage imageNamed:@"Yellow&Red.png"];
}
}
}
}
在我的UITableView中我这样做,所以你知道上面的代码是什么
NSMutableDictionary *gameInfoObject =[_events objectAtIndex:indexPath.row];
所以基本上如果EVENTS数组中有多个事件,其中eventType等于"黄卡"以及那些匹配的名称我需要将图像更改为"黄色和红色"
谢谢你的帮助
答案 0 :(得分:0)
考虑使用NSCountedSet作为对象。您将获得恒定的时间查找和计数。
答案 1 :(得分:0)
我首先使用NSArray提供的一种快速枚举器方法。
NSIndexSet *matchingSet = [_events indexesOfObjectsPassingTest:^BOOL(id obj,
NSUInteger idx,
BOOL *stop){
return ([gameInfoObject[@"name"] isEqualToString:obj[@"name"] && [obj[@"eventType"] isEqualToString:@"Yellow Card"])
}];
if (matchingSet.count >= 2) {
imageType = [UIImage imageNamed:@"Yellow&Red.png"];
}
答案 2 :(得分:0)
你可以用几种不同的方式做到这一点。就个人而言,我认为拥有一个事件对象对你的代码来说是最具可读性的,但是如果你想使用像NSArray
和NSDictionary
这样的简单对象,你可以用两个额外的{{}来轻松解决这个问题。 {1}}或一个额外的NSMutableArray
或一个额外的NSMutableDictionary
。
NSCountedSet
S:
NSMutableSet
NSMutableSet *yellowCardPlayers;
NSMutableSet *redCardPlayers;
- (void)receiveEvent:(NSDictionary *)event {
[_events addObject:event];
if ([event[@"eventType"] isEqualToString:@"Yellow Card"]) {
if ([yellowCardPlayers containsObject:event[@"name"]]) {
if ([redCardPlayers containsObject:event[@"name"]]) {
// How did a player get a yellow card after already being ejected from the game?! :)
} else {
[redCardPlayers addObject:event[@"name"]];
}
} else {
[yellowCardPlayers addObject:event[@"name"]];
}
}
}
:
NSMutableDictionary
NSMutableDictionary *playerYellowCards;
- (void)receiveEvent:(NSDictionary *)event {
[_events addObject:event];
if ([event[@"eventType"] isEqualToString:@"Yellow Card"]) {
NSNumber *numberOfYellowCards = [playerYellowCards objectForKey:event[@"name"]];
if (![[playerYellowCards allKeys] containsObject:event[@"name"]]) {
[playerYellowCards addObject:@(1) forKey:event[@"name"]];
} else {
[playerYellowCards addObject:@([playerYellowCards[event[@"name"]] integerValue]+1) forKey:event[@"name"]];
}
}
}
:
NSCountedSet
答案 3 :(得分:0)
使用NSPredicate过滤数组,然后计算结果:
NSPredicate *yellowFlagFilter = [NSPredicate predicateWithFormat:@"eventType == %@ AND name == %@",@"Yellow Card", gameInfoObject.name];
NSArray *yellowCards = [_events filteredArrayUsingPredicate:yellowFlagFilter];
if ([yellowCards count] > 1) {
imageType = [UIImage imageNamed:@"Yellow&Red.png"];
}