2014-02-02 3 views
-5

У меня есть массив словаря, который нужно суммировать в зависимости от значения внутри. Строка PO будет критерием группировки, который является динамическим.Создание базы данных словаря по массиву nsdictionary

Нужно подсчитать количество элементов на 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; 
}, 
+1

Это выглядит идентично предыдущему вопросу, на котором был принят ответ. –

+0

Да, но я не могу понять, чтобы получить позиции. – baste

+0

действительно не получают lineItems ... но я думаю, что это просто отличный счет каждого POx –

ответ

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); 
    } 
} 
+0

завернутый в исполняемую программу, реальная логика довольно короткая –

+0

очень приятно. Спасибо – baste

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]; 
    }]; 
+0

Спасибо Maciej Oczko Мне нужно узнать ваш код, прежде всего, я был удивлен этим. я, конечно, новичок :) – baste

+0

это выглядит немного сложнее .. хотя я уверен, что он сработает. есть WAY слишком много сортировки: D –

+0

Daij-Djan вы правы. Код открыт для оптимизации;) Ваше решение лучше. –

Смежные вопросы