【问题标题】:how to group array of nsdictionary according to the value inside the element如何根据元素内的值对 nsdictionary 数组进行分组
【发布时间】:2014-02-01 23:22:34
【问题描述】:

我有一个字典数组,需要根据作为元素的一部分的 PO 进行分组,并且还根据同一个 PO 获得 quantityOrdered 的总数。 PO 是动态的,这意味着它可以是任何需要过滤并相应计算 quantityOrderd 的值。

请帮忙。

{
    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;
},

我更新了我的示例并使其易于阅读。

【问题讨论】:

  • NSDictionarys 不像 NSArrays 那样维护其元素的顺序。
  • 您是在问如何根据其中一个键的值对 NSDictionary 数组进行排序?
  • 问题已更新,感谢关注。
  • 如果您的示例中的传入数量和输出总数匹配,也许我们会提供更多帮助。
  • 糟糕的是我没有看到最后一行。

标签: ios objective-c filter nsmutablearray nsdictionary


【解决方案1】:
- (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 会带来更多痛苦。

【讨论】:

  • 我们如何知道收到的数量是 PO1 PO2 还是 PO3。谢谢你的回复。
  • 我不知道。这是您使用“dicts 数组”输出格式的示例。
  • 如果您询问这段代码是如何工作的——每个“结果记录”都由 po-key 缓存并在缓存中找到时被重用(否则它会被创建并添加到结果数组和缓存中以及)。
  • 谢谢你太棒了,我现在就试试。对不起,我是新手。再次感谢您。
  • 再问我如何计算特定 PO 出现的行数
【解决方案2】:

您可以使用 KVC 聪明的方法或愚蠢的简单方法来做到这一点。让我们用愚蠢的简单方法来做吧!

创建一个空的 NSMutableDictionary。我们就叫它dict吧。

循环浏览您的字典数组。对于每个字典:

  1. 获取其采购订单。调用该值thisPO

  2. 获取dict[thisPO]。是零吗?

    一个。是的。好的,所以还没有遇到这个特定的 PO。将dict[thisPO] 设置为该字典接收的数量(作为 NSNumber)。

    b.不。将该值转换为整数,添加此字典接收的数量,然后将总数设置回dict[thisPO](作为 NSNumber)。

完成!结果并不完全符合您的要求;结果如下所示:

{
    PO1 = 100;
    PO2 = 120;
    ...
}

但是现在,你看,求和的工作已经完成,如果你想要的话,很容易将它转换成一个字典数组。

【讨论】:

  • 谢谢你,马特,但我怎样才能确保所有 POs PO1 与 PO2 的总数相同?
  • 这就是步骤 2b 的作用。
【解决方案3】:

不是 100% 确定这是否是您所说的,但要根据其中一个元素对字典数组进行排序,它看起来像这样。

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/.

然后您可以循环遍历数组,现在以正确的顺序构建您的下一个 NSDictionary。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    相关资源
    最近更新 更多