Valor máximo para cada object en una matriz de dictionarys

Tengo una variedad de dictionarys que estoy tratando de get la puntuación máxima para cada jugador en la matriz. Cada jugador puede tener múltiples inputs. Estoy tratando de get una gran variedad de dictionarys de cada mejor puntuación de los jugadores.

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 

He intentado utilizar NSPnetworkingicate pnetworkingicateWithFormat, pero solo puedo recuperar el máximo para todo en la matriz no relacionada con el nombre.

Rendimiento esperado:

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 

Gracias por la ayuda.

No puede usar un NSPnetworkingicate para esto, ya que desea determinar la puntuación máxima para varios jugadores diferentes. Bajo las cubiertas, NSPnetworkingicate itera la matriz de todos modos, por lo que usar su propio bucle no es less eficiente. En el siguiente código he asumido que los puntajes y los nombres de los jugadores están envueltos en 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]; } 

Puedes hacerlo manualmente así:

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

Prueba esto:

 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"]; NSPnetworkingicate *pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"self.NameID==%@", nameID]; NSInteger index = [users indexOfObjectPassingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { BOOL found = [pnetworkingicate 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); 
 - (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]; } 

Lo que necesita hacer es encontrar puntajes para cada usuario, luego encontrar el puntaje máximo fuera de él.

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