我有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值。
通常,我的要求是获取公共元素(基于键的值)并将它们放入新数组中。使用大型数据集在运行时执行此操作的最佳方法是什么。
答案 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 );
}