2016-10-23 8 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を使用しようとしましたが、名前に関連していない配列内のすべてに対して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

あなたNSPredicateで名前IDを入れてみましたか?どのように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 
関連する問題