我有一个字典数组,需要根据里面的值进行汇总。 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;
},
答案 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);
}
}