知道字典是否具有两个以上相同值的有效方法

时间:2014-10-22 13:16:47

标签: ios objective-c uitableview dictionary nsmutabledictionary

我有一个包含事件的字典。一个事件的格式如下所示

{
   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等于"黄卡"以及那些匹配的名称我需要将图像更改为"黄色和红色"

谢谢你的帮助

4 个答案:

答案 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)

你可以用几种不同的方式做到这一点。就个人而言,我认为拥有一个事件对象对你的代码来说是最具可读性的,但是如果你想使用像NSArrayNSDictionary这样的简单对象,你可以用两个额外的{{}来轻松解决这个问题。 {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"];
}