根据nsdictionary数组创建字典摘要

时间:2014-02-02 11:20:22

标签: ios objective-c nsarray nsdictionary nspredicate

我有一个字典数组,需要根据里面的值进行汇总。 PO行将是动态的分组标准。

需要计算每个采购单元素的数量和接收数量的总和。

 {
    PO = PO2;
    QuantityReceived = 1;
},
{
    PO = PO1;
    QuantityReceived = 3;
},
{

    PO = PO1;
    QuantityReceived = 3;
},
{
    PO = PO3;
    QuantityReceived = 2;
},
{
    PO = PO2;
    QuantityReceived = 2;
},
{
    PO = PO3;
    QuantityReceived = 4;
},
{

    PO = PO1;
    QuantityReceived = 1;
},

示例输出是:

{
   PO = PO1;
   TotalQuanityReceived=7;
   LineItems=3;
},
{
   PO = PO2;
   TotalQuanityReceived=3;
   LineItems=2;
},
{
   PO = PO3;
   TotalQuanityReceived=6;
   LineItems=2;
},

2 个答案:

答案 0 :(得分:1)

可能有几种方法。可以实现这样的写作:

    NSString *mainKey = @"PO";
    NSString *totalKey = @"TotalQuantityReceived";
    NSString *quantityKey = @"QuantityReceived";
    NSString *lineItemsKey = @"LineItems";

    void (^updateDictionary)(NSMutableDictionary *, NSDictionary *) = ^(NSMutableDictionary *outputDictionary, NSDictionary *inputDictionary) {
        outputDictionary[totalKey] = @([outputDictionary[totalKey] integerValue] + [inputDictionary[quantityKey] integerValue]);
        outputDictionary[lineItemsKey] = @([outputDictionary[lineItemsKey] integerValue] + 1);
    };

     NSMutableArray *output = [NSMutableArray array];
    [array enumerateObjectsUsingBlock:^(NSDictionary *dictionary, NSUInteger idx, BOOL *stop) {
        id key = dictionary[mainKey];
        NSDictionary *existingDictionary = [[output filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%K == %@", mainKey, key]] lastObject];
        NSMutableDictionary *outputDictionary = [existingDictionary mutableCopy];
        if (!outputDictionary) {
            outputDictionary = [NSMutableDictionary dictionaryWithObject:key forKey:mainKey];
            updateDictionary(outputDictionary, dictionary);
            [output addObject:outputDictionary];
        } else {
            updateDictionary(outputDictionary, dictionary);
            [output replaceObjectAtIndex:[output indexOfObject:existingDictionary] withObject:outputDictionary];
        }
    }];

    [output sortUsingComparator:^NSComparisonResult(NSDictionary *dictionary1, NSDictionary *dictionary2) {
        NSString *key1 = dictionary1[mainKey];
        NSString *key2 = dictionary2[mainKey];
        return [key1 compare:key2];
    }];

答案 1 :(得分:1)

简而言之:

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    @autoreleasepool {
        //INPUT DATA
        NSArray *inputPos = @[ @{ @"PO":@"PO2", @"QuantityReceived":@1 },
        @{ @"PO":@"PO1", @"QuantityReceived":@3 },
        @{ @"PO":@"PO1", @"QuantityReceived":@3 },
        @{ @"PO":@"PO3", @"QuantityReceived":@2 },
        @{ @"PO":@"PO2", @"QuantityReceived":@2 },
        @{ @"PO":@"PO3", @"QuantityReceived":@4 },
        @{ @"PO":@"PO1", @"QuantityReceived":@1 }];

        //REAL LOGIC
        NSMutableArray *originalPOs = [inputPos mutableCopy];
        NSMutableArray *groupedPOs = [@[] mutableCopy];

        while(originalPOs.count) {
            NSArray *matchingPOs = [originalPOs filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"PO == %@", originalPOs[0] [@"PO"]]];
            [originalPOs removeObjectsInArray:matchingPOs];

            NSInteger sum = 0;
            NSArray *qs = [matchingPOs valueForKeyPath:@"QuantityReceived"];
            for(NSNumber *quantity in qs)
                sum += quantity.integerValue;

            [groupedPOs addObject:@{@"PO":matchingPOs[0][@"PO"], @"QuantityReceived":@(sum), @"LineItems":@(qs.count)}];
        }

        NSLog(@"%@", groupedPOs);
    }
}