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
    

    您是否尝试过过滤/迭代并将数据拆分为不同的列表(月前和每人)。然后求和。一旦你这样做了,看看如何使用。