2016-10-23 54 views
3

我有一个字典数组,我试图获得数组中每个玩家的最大分数。每个玩家可以有多个条目,我试图获得每个玩家最佳分数的字典阵列。字典数组中的每个对象的最大值

的NSArray [0] - 的NSDictionary

 - [0] Score: (double)20.7 
     - [1] NameID: (int) 1 
     - [2] Date 

[1] - 的NSDictionary

 - [0] Score: (double)25 
     - [1] NameID: (int) 1 
     - [2] Date 

[2] - 的NSDictionary

 - [0] Score: (double)28 
     - [1] NameID: (int) 2 
     - [2] Date 

[3] - NSDictionary`

 - [0] Score: (double)26 
     - [1] NameID: (int) 3 
     - [2] Date 

我已经尝试过使用NSPredicate predicateWithFormat,但我只能找回与名称无关的数组中的所有内容。

预期输出:

的NSArray [1] - 的NSDictionary

 - [0] Score: (double)25 
     - [1] NameID: (int) 1 
     - [2] Date 

[2] - 的NSDictionary

 - [0] Score: (double)28 
     - [1] NameID: (int) 2 
     - [2] Date 

[3] - NSDictionary`

 - [0] Score: (double)26 
     - [1] NameID: (int) 3 
     - [2] Date 

感谢您的帮助。

+0

你尝试把在填充NameID你NSPredicate?你如何设置你的NSPredicate? –

+0

我不知道如何将NameID添加到谓词中,并评估最高分数......我尝试了很多不同的方法,包括子查询,但我失去了一些东西......我试过这个,但后来发现它是完全错误的。 .. NSPredicate * predicate1 = [NSPredicate predicateWithFormat:@“SELF.Score = NameID。@ max.Score”]; – Shorty07

+1

不要过时。只需迭代字典数组,随时创建输出字典。对于每个玩家ID,只需在输出字典中检查分数(如果有的话)并在需要时更新输出 – Paulw11

回答

2

你不能使用NSPredicate这个,因为你想确定几个不同球员的最高分数。在封面下,NSPredicate反复使用数组,所以使用你自己的循环并不是那么低效。在下面的代码,我认为得分和球员名字被包裹在NSNumber

-(NSArray *)maxScoresForPlayers:(NSArray *)playerScores { 

    NSMutableDictionary *maxScores = [NSMutableDictionary new]; 

    for (NSDictionary *player in playerScores) { 
     NSNumber *playerID = (NSNumber *)player[@"NameID"]; 
     NSDictionary *playerMax = maxScores[playerID]; 
     if (playerMax == nil) { 
      playerMax = player; 
     } else { 
      NSNumber *currentMax = (NSNumber *)[playerMax[@"Score"]; 
      NSNumber *playerScore = (NSNumber *)player[@"Score"]; 
      if ([playerScore doubleValue] > [currentMax doubleValue]) { 
       playerMax = player; 
      } 
     } 
     maxScores[playerID] = playerMax; 
    } 

    return([maxScores allValues]; 
} 
1

您可以手动像这样做:

NSMutableDictionary *maxScoresDict = [NSMutableDictionary dictionary]; 
for (NSDictionary *score in scoresArray) { 
    NSNumber *key = score[@"NameID"]; 
    NSNumber *savedMax = maxScoresDict[key][@"Score"]; 
    NSNumber *currentMax = maxScoresDict[key][@"Score"]; 
    if (savedMax == nil || [currentMax doubleValue] > [savedMax doubleValue]) { 
     maxScoresDict[key] = score; 
    } 
} 
NSArray *maxScoresArray = [maxScoresDict allValues]; 
-1

你需要做的是找到得分为每个用户,然后从中找出最高分数。

- (void)findMaxScoreForUser:(int)userId { 

NSDictionary *dict0 = [NSDictionary dictionaryWithObjects:@[@27.0,@3] forKeys:@[@"Score",@"UserID"]]; 
NSDictionary *dict1 = [NSDictionary dictionaryWithObjects:@[@25.0,@2] forKeys:@[@"Score",@"UserID"]]; 
NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:@[@23.0,@3] forKeys:@[@"Score",@"UserID"]]; 

NSArray *arr = [NSArray arrayWithObjects:dict0,dict1,dict2, nil]; 
NSMutableArray *scores = [NSMutableArray array]; 
for (NSDictionary *dict in arr) { 
    int userID = [[dict valueForKey:@"UserID"] intValue]; 
    if (userId == userID) { 
     [scores addObject:[dict valueForKey:@"Score"]]; 
    } 
} 

int max = [[scores valueForKeyPath:@"@max.intValue"] intValue]; 

} 
+0

如果我可能会问,这是什么票? –

0

试试这个:

NSArray *objects = @[@{@"Score": @(20.7), 
         @"NameID": @(1), 
         @"Date": [NSDate date]}, 
        @{@"Score": @(25), 
         @"NameID": @(1), 
         @"Date": [NSDate date]}, 
        @{@"Score": @(28), 
         @"NameID": @(2), 
         @"Date": [NSDate date]}, 
        @{@"Score": @(26), 
         @"NameID": @(3), 
         @"Date": [NSDate date]}]; 
NSMutableArray *users = [NSMutableArray array]; 

for (NSInteger i=0; i<objects.count; i++) { 

    NSDictionary *dict = objects[i]; 
    NSNumber *nameID = dict[@"NameID"]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.NameID==%@", nameID]; 
    NSInteger index = [users indexOfObjectPassingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
     BOOL found = [predicate evaluateWithObject:obj]; 
     return found; 
    }]; 

    if (index != NSNotFound) { 
     NSNumber *score1 = dict[@"Score"]; 
     NSNumber *score2 = users[index][@"Score"]; 

     if (score1.doubleValue > score2.doubleValue) { 
      [users replaceObjectAtIndex:index withObject:dict]; 
     } 
    } 
    else { 
     [users addObject:dict]; 
    } 
} 
NSLog(@"%@", users); 
0
- (NSArray *)getBestScores:(NSArray *)players { 
    NSMutableDictionary *best = [[NSMutableDictionary alloc] init]; 
    for (NSDictionary *p in players) { 
     NSDictionary *b = [best valueForKey:[p valueForKey:@"NameID"]]; 
     if (!b || [[p valueForKey:@"Score"] doubleValue] > [[b valueForKey:@"Score"] doubleValue]) 
      [best setValue:p forKey:[p valueForKey:@"NameID"]]; 
    } 
    return [best allValues]; 
} 
0
// Get Max Value of integer element from Array of Dictonaries. 
// Example Array Starts 

<paramArray>(
{ 
DicID = 1; 
Name = "ABC"; 
ValuetoCalculateMax = 2800; 
}, 
{ 
DicID = 2; 
Name = "DEF"; 
ValuetoCalculateMax = 2801; 
}, 
{ 
DicID = 3; 
Name = "GHI"; 
ValuetoCalculateMax = 2805; 
} 
) 
// Example Array Ends 

// Implementation 


int MaxintegerValue=0; 

MaxintegerValue=[self getMaxValueFromArrayofDictonaries:paramArray]; 

// Implementation Ends 


// Function Starts 

-(int)getMaxValueFromArrayofDictonaries:(NSArray *)paramArray 
{ 
int MaxValue=0; 
NSMutableDictionary *dic=[[NSMutableDictionary alloc]init]; 
for (int i=0; i<[paramArray count]; i++) 
{ 
    dic=[paramArray objectAtIndex:i]; 
    if ([[dic valueForKey:@"ValuetoCalculateMax"] intValue] > MaxValue) 
    { 
     MaxValue=[[dic valueForKey:@"ValuetoCalculateMax"] intValue]; 
    } 
    else 
    { 
     MaxValue=MaxValue; 
    } 
    } 
    return MaxValue; 
} 

// Function Ends