Ios 从nsarray检索选择信息
我有一个包含以下词典的数组:Ios 从nsarray检索选择信息,ios,objective-c,nsarray,nsdictionary,Ios,Objective C,Nsarray,Nsdictionary,我有一个包含以下词典的数组: <array> <dict> <key>date</key> <string>15/Feb/14</string> <key>name</key> <string>Victor</string> <key>sale</key> <string>3</strin
<array>
<dict>
<key>date</key>
<string>15/Feb/14</string>
<key>name</key>
<string>Victor</string>
<key>sale</key>
<string>3</string>
</dict>
<dict>
<key>date</key>
<string>21/Feb/14</string>
<key>name</key>
<string>Sonny</string>
<key>sale</key>
<string>12</string>
</dict>
<dict>
<key>date</key>
<string>3/Feb/14</string>
<key>name</key>
<string>Mike</string>
<key>sale</key>
<string>1</string>
</dict>
<dict>
<key>date</key>
<string>02/Jan/14</string>
<key>name</key>
<string>Victor</string>
<key>sale</key>
<string>6</string>
</dict>
<dict>
<key>date</key>
<string>04/Jan/14</string>
<key>name</key>
<string>Sonny</string>
<key>sale</key>
<string>3</string>
</dict>
<dict>
<key>date</key>
<string>02/Jan/14</string>
<key>name</key>
<string>Mike</string>
<key>sale</key>
<string>8</string>
</dict>
<dict>
<key>date</key>
<string>02/Dec/13</string>
<key>name</key>
<string>Victor</string>
<key>sale</key>
<string>2</string>
</dict>
<dict>
<key>date</key>
<string>02/Dec/13</string>
<key>name</key>
<string>Sonny</string>
<key>sale</key>
<string>8</string>
</dict>
<dict>
<key>date</key>
<string>12/Dec/13</string>
<key>name</key>
<string>Mike</string>
<key>sale</key>
<string>0</string>
</dict>
</array>
但我遇到的问题是如何获得以下信息:
你基本上只需要知道你已经在做什么,但要局限于你所关心的情况。例如,要将其限制为一个人,您可以执行以下操作
- (double)totalSalesForPerson:(NSString *)person {
double total = 0.0;
for (NSDictionary *totalDictionary in salesArray) {
if ([[totalDictionary objectForKey:@"name"] isEqualToString person])
total += [[totalDictionary objectForKey:@"sale"] doubleValue];
}
return total;
}
试着对约会做同样的事情。如果您在这方面遇到问题,我们可以帮助您。要按月计算总销售额,我会这样做。我没有测试我的代码,但它应该接近您试图实现的目标
- (double)totalSalesForMonth:(int)month {
double total = 0.0;
for (NSDictionary *totalDictionary in salesArray) {
NSDateFormatter *timeFormat = [[NSDateFormatter alloc]init];
timeFormat.dateFormat = [NSString stringWithFormat:@"dd/MMM/yy"];
NSDate *date = [timeFormat dateFromString:[totalDictionary objectForKey:@"date"]];
[timeFormat setDateFormat:@"M"];
if (month == [[timeFormat stringFromDate:date] intValue])
total += [[totalDictionary objectForKey:@"sale"] doubleValue];
}
return total;
}
我还稍微修改了@ansible的答案,将所有名称转换为小写字符串
- (double)totalSalesForPerson:(NSString *)person {
double total = 0.0;
for (NSDictionary *totalDictionary in salesArray) {
if ([[[totalDictionary objectForKey:@"name"] lowercaseString] isEqualToString:[person lowercaseString]])
total += [[totalDictionary objectForKey:@"sale"] doubleValue];
}
return total;
}
这里有一个不同的方法。假设您提供的数据位于一个名为
data
的数组中:
按名称获取总销售额,不考虑日期:
// Get a unique set of names
NSSet *names = [NSSet setWithArray:[data valueForKeyPath:@"name"]];
// Run through the names and get the total for each one
for (NSString *currentName in names) {
// Get all data for the current name
NSArray *currentNameData = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name = %@", currentName]];
// Add up sales for that name
NSNumber *currentNameTotal = [currentNameData valueForKeyPath:@"@sum.sale"];
NSLog(@"%@ total: %@", currentName, currentNameTotal);
}
这张照片是:
2014-02-26 18:21:40.165 Untitled 5[5825:507] Victor total: 11
2014-02-26 18:21:40.166 Untitled 5[5825:507] Mike total: 9
2014-02-26 18:21:40.167 Untitled 5[5825:507] Sonny total: 23
2014-02-26 18:21:40.169 Untitled 5[5825:507] Total for Dec: 10
2014-02-26 18:21:40.175 Untitled 5[5825:507] Total for Feb: 16
2014-02-26 18:21:40.177 Untitled 5[5825:507] Total for Jan: 17
由于date
字符串不仅仅包含月份名称,所以按月份获取总计要困难一些
// Get a unique set of month names (loop because date contains more than the month name)
NSSet *dateStrings = [NSSet setWithArray:[data valueForKeyPath:@"date"]];
NSMutableSet *monthNames = [NSMutableSet set];
for (NSString *dateString in dateStrings) {
NSArray *dateStringComponents = [dateString componentsSeparatedByString:@"/"];
[monthNames addObject:dateStringComponents[1]];
}
使用您的数据,monthNames
现在包含Dec
、Jan
和Feb
。然后使用与上述名称汇总类似的方法按月查找汇总:
for (NSString *monthName in monthNames) {
// Get all data for dates containing monthName
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date CONTAINS %@", monthName];
NSArray *currentMonthData = [data filteredArrayUsingPredicate:predicate];
// Add up sales for that month
NSNumber *monthTotal = [currentMonthData valueForKeyPath:@"@sum.sale"];
NSLog(@"Total for %@: %@", monthName, monthTotal);
}
这张照片是:
2014-02-26 18:21:40.165 Untitled 5[5825:507] Victor total: 11
2014-02-26 18:21:40.166 Untitled 5[5825:507] Mike total: 9
2014-02-26 18:21:40.167 Untitled 5[5825:507] Sonny total: 23
2014-02-26 18:21:40.169 Untitled 5[5825:507] Total for Dec: 10
2014-02-26 18:21:40.175 Untitled 5[5825:507] Total for Feb: 16
2014-02-26 18:21:40.177 Untitled 5[5825:507] Total for Jan: 17
您是否尝试过过滤/迭代并将数据拆分为不同的列表(月前和每人)。然后求和。一旦你这样做了,看看如何使用。