2016-10-23 2 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 

Я пробовал использовать предикат NSPredicateWithFormat, но я могу только вернуть max для всего массива, не связанного с именем.

Ожидаемые результаты:

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 = [предикат NSPredicateWithFormat: @ "SELF.Score = NameID. @ Max.Score"]; – Shorty07

+1

Не переусердствуйте. Просто перебирайте массив словарей, создавая свой выходной словарь, когда идете.Для каждого идентификатора игрока просто проверяйте оценку по отношению к той, что находится в выходном словаре (если есть), и обновляйте вывод, если требуется – 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 
Смежные вопросы