如何根据元素内部的值将nsdictionary数组分组
我有一个字典数组需要根据作为元素的一部分的PO进行分组,并且也根据相同的PO得到quantityOrdered的总和。 采购订单是dynamic的,这意味着它可以是需要过滤的任何值,并相应地计算出数量。
请帮忙。
{ 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; },
道歉的困惑或不完整的问题,但我需要创build一个类似这样的新的字典数组:
{ PO = PO1; TotalQuanityReceived=7; LineItems=3; }, { PO = PO2; TotalQuanityReceived=3; LineItems=2; }, { PO = PO3; TotalQuanityReceived=6; LineItems=2; },
我更新了我的例子,使其易于阅读。
- (NSArray *)whatever:(NSArray *)dictionaries { NSMutableArray *results = [[NSMutableArray alloc] init]; NSMutableDictionary *resultsByPO = [[NSMutableDictionary alloc] init]; for (NSDictionary *dictionary in dictionaries) { id po = [dictionary objectForKey:@"PO"]; NSMutableDictionary *result = [resultsByPO objectForKey:po]; if (result == nil) { result = [[NSMutableDictionary alloc] init]; [resultsByPO setObject:result forKey:po]; [results addObject:result]; [result setObject:po forKey:@"PO"]; } double total = [[result objectForKey:@"TotalQuantityReceived"] doubleValue]; total += [[dictionary objectForKey:@"QuantityOrdered"] doubleValue]; int count = 1 + [[result objectForKey:@"Count"] intValue]; [result setObject:@(total) forKey:@"TotalQuantityReceived"]; [result setObject:@(count) forKey:@"Count"]; } return results; }
PO值不符合NSCopying
会带来更多的痛苦。
你可以用KVC或愚蠢的简单方法来做到这一点。 让我们这样做愚蠢的简单的方法!
制作一个空的NSMutableDictionary。 我们称之为dict
。
循环访问您的字典数组。 对于每个字典:
-
取其PO。 称这个值为
thisPO
。 -
取
dict[thisPO]
。 是零吗?一个。 是。 好的,所以这个PO还没有遇到。 将
dict[thisPO]
设置为收到的字典数量(作为NSNumber)。湾 否。将该值转换为一个整数,添加收到的字典数量,并将总数设置为
dict[thisPO]
(作为NSNumber)。
完成! 结果不是你所要求的; 结果如下所示:
{ PO1 = 100; PO2 = 120; ... }
但是现在你明白了,总计的工作已经完成了,如果这是你想要的,很容易把它转换成一系列字典。
不是100%确定,如果这是你所说的或不是,而是根据其中一个元素来sorting字典数组,它将看起来像这样。
NSDictionary *d1 = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithDouble:100],@"PO", [NSNumber numberWithDouble:0], @"Category", nil]; NSDictionary *d2 = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithDouble:50],@"PO", [NSNumber numberWithDouble:90], @"Category", nil]; NSArray *unsorted = @[d1, d2]; NSArray *sortedArray; sortedArray = [unsorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { NSDictionary *first = (NSDictionary*)a; NSDictionary *second = (NSDictionary*)b; NSNumber *firstPO = [first objectForKey:@"PO"]; NSNumber *secondPO = [second objectForKey:@"PO"]; return [firstPO compare:secondPO]; }]; NSLog(@"unsorted = %@", unsorted); NSLog(@"sorted = %@", sortedArray);
我不太确定PO是什么,所以我只是以NSNumber为例。 查看此页面,了解如何比较客户对象。 http://nshipster.com/nssortdescriptor/ 。
然后,您可以循环访问数组,现在按照正确的顺序构build下一个NSDictionary。