根据键的值从字典的NSArray中获取公共元素

时间:2014-08-08 03:58:40

标签: ios objective-c nsarray nspredicate

我有NSDictionaries的NSMutableArray。这是阵列。

Month records (
    {
    BMI = "209.75";
    Date = "15/07/2014 09:03 AM";
    Height = 42;
    Weight = 37;
    day = 15;
    month = 7;
    year = 2014;
},
    {
    BMI = "366.67";
    Date = "21/07/2014 09:03 AM";
    Height = 30;
    Weight = 33;
    day = 21;
    month = 7;
    year = 2014;
},
    {
    BMI = "831.02";
    Date = "15/07/2014 09:04 AM";
    Height = 19;
    Weight = 30;
    day = 15;
    month = 7;
    year = 2014;
}
)  

现在我想获取相同“day”的元素(根据这里,有2个元素“day = 15”和1个元素“day = 7”)。然后计算该特定日期的平均BMI值。

通常,我的要求是获取公共元素(基于键的值)并将它们放入新数组中。使用大型数据集在运行时执行此操作的最佳方法是什么。

2 个答案:

答案 0 :(得分:1)

int day = /* ... */;
NSArray* recordsForDay = [records filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"day == %d", day]];

或:

NSIndexSet* indexes = [record indexesOfObjectsPassingTest:^BOOL (NSDictionar* record, NSUInteger idx, BOOL *stop) {
    return [[record objectForKey:@"day"] intValue] == day;
}];
NSArray* recordsForDay = [records objectsAtIndexes:indexes];

答案 1 :(得分:1)

我认为您已经发现,使用当前存储值的方式很难做到这一点。如果你可以改变你构建词典的方式,你可以很简单:

NSMutableArray *records = [NSMutableArray arrayWithCapacity:2];

NSDictionary *record = @{@"BMI":[NSNumber numberWithFloat:209.75],
                         @"Date":@"15/07/2014 09:03 AM",
                         @"Height":[NSNumber numberWithInt:42],
                         @"Weight":[NSNumber numberWithInt:37],
                         @"DayMonthYear":[NSNumber numberWithInt:20140715],
                         @"day":[NSNumber numberWithInt:15],
                         @"month":[NSNumber numberWithInt:7],
                         @"year":[NSNumber numberWithInt:2014] };

[records addObject:record];


record = @{@"BMI": [NSNumber numberWithFloat:366.67],
           @"Date":@"21/07/2014 09:03 AM",
           @"Height":[NSNumber numberWithInt:30],
           @"Weight":[NSNumber numberWithInt:33],
           @"DayMonthYear":[NSNumber numberWithInt:20140721],
           @"day":[NSNumber numberWithInt:21],
           @"month":[NSNumber numberWithInt:7],
           @"year":[NSNumber numberWithInt:2014] };

[records addObject:record];

record = @{@"BMI":[NSNumber numberWithFloat:831.02],
           @"Date":@"15/07/2014 09:04 AM",
           @"Height":[NSNumber numberWithInt:19],
           @"Weight":[NSNumber numberWithInt:30],
           @"DayMonthYear":[NSNumber numberWithInt:20140715],
           @"day":[NSNumber numberWithInt:15],
           @"month":[NSNumber numberWithInt:7],
           @"year":[NSNumber numberWithInt:2014] };

[records addObject:record];

现在我们已经设置了BMI为数字值的字典,以及日,月和年的单个字段,使用谓词和KVC集合运算符非常简单。

NSArray *distintDatesArray = [records valueForKeyPath:@"@distinctUnionOfObjects.DayMonthYear"];

for( NSNumber *dayMonthYearValue in distintDatesArray )
{
    NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"DayMonthYear = %@", dayMonthYearValue ]];

    NSArray *filteredRecords = [records filteredArrayUsingPredicate:filter];

    NSNumber *avgBMI = [filteredRecords valueForKeyPath:@"@avg.BMI"];

    NSLog( @"Avg BMI on %@: %@", dayMonthYearValue, avgBMI );

}