Как перебрать и добавить дубликаты в массив

У меня есть словарь с массивом заказов с количеством и заказами в нем Orders = ("3 White Shirts", "8 White Shirts", "4 blue shorts")

Как бы я прошел через это и добавить количество повторяющихся заказов, чтобы результирующая строка или массив былиOrders = ("11 White Shirts", "4 blue shorts") or myString ="11 White Shirts, 4 blue shorts"

Я думаю, что какая-то подстрока, чтобы проверить, совпадают ли продукты, но не уверен, как получить правильное количество для добавления из дубликата заказа

Большое спасибо

3 ответа

Решение

Хорошо, вот способ сделать это (самый короткий, который я мог придумать):

// Assuming that 'orders' is the array in your example
NSMutableDictionary *orderDict = [[NSMutableDictionary alloc] init]; 

for (NSString *order in orders)
{
    // Separate the string into components
    NSMutableArray *components = [[order componentsSeparatedByString:@" "] mutableCopy];

    // Quantity is always the first component
    uint quantity = [[components objectAtIndex:0] intValue];
    [components removeObjectAtIndex:0];

    // The rest of them (rejoined by a space is the actual product)
    NSString *item = [components componentsJoinedByString:@" "];

    // If I haven't got the order then add it to the dict
    // else get the old value, add the new one and put it back to dict
    if (![orderDict valueForKey:item])
        [orderDict setValue:[NSNumber numberWithInt:quantity] forKey:item];
    else{
        uint oldQuantity = [[orderDict valueForKey:item] intValue];
        [orderDict setValue:[NSNumber numberWithInt:(oldQuantity+quantity)] forKey:item];
    }
}

Это дало бы вам такой толчок:

{
    "White Shirts" = 11;
    "blue shorts" = 4;
}

Таким образом, вы можете перебрать ключи и создать массив строк, например:

NSMutableArray *results = [[NSMutableArray alloc] initWithCapacity:0];
for (NSString *key in [orderDict allKeys])
{
    [results addObject:[NSString stringWithFormat:@"%@ %@", [orderDict valueForKey:key], key]];
}

Что в итоге даст вам:

(
    "11 White Shirts",
    "4 blue shorts"
) 

PS. Не забудьте отпустить, если вы не используете ARC!

Поскольку ваш массив содержит строковые объекты, я бы сделал что-то вроде этого:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSArray *ordersAsStrings = [NSArray arrayWithObjects:@"7 white shirts", @"4 blue jeans", @"3 white shirts", @"4 blue jeans", nil];
        NSMutableDictionary *combinedQuantities = [NSMutableDictionary new];
        NSMutableArray *combinedOrdersAsStrings = [NSMutableArray new];

        // take each string and break it up into the quantity and the item
        for (NSString *orderAsString in ordersAsStrings) {
            NSInteger scannedQuantity = 0;
            NSString *scannedItem = nil;
            NSScanner *scanner = [NSScanner scannerWithString:orderAsString];
            [scanner scanInteger:&scannedQuantity];
            [scanner scanCharactersFromSet:[[NSCharacterSet illegalCharacterSet] invertedSet] intoString:&scannedItem];

            // if the item is already in combinedOrders
            if ([combinedQuantities.allKeys containsObject:scannedItem] == YES) {
                // update quantity
                NSNumber *existingQuantity = [combinedQuantities objectForKey:scannedItem];
                NSInteger combinedQuantity = existingQuantity.integerValue + existingQuantity.integerValue;
                [combinedQuantities setObject:[NSNumber numberWithInteger:combinedQuantity] forKey:scannedItem];
            } else {
                // otherwise add item
                NSNumber *quantity = [NSNumber numberWithInteger:scannedQuantity];
                [combinedQuantities setObject:quantity forKey:scannedItem];
            }
        }

        // change combined quantities back into strings
        for (NSString *key in combinedQuantities.allKeys) {
            NSNumber *quantity = [combinedQuantities objectForKey:key];
            NSString *orderAsString = [NSString stringWithFormat:@"%ld %@", quantity.integerValue, key];
            [combinedOrdersAsStrings addObject:orderAsString];
        }

        NSLog(@"Combined Orders: %@", combinedOrdersAsStrings);
    }
    return 0;
}

Вам необходимо проанализировать строки, чтобы извлечь две части информации: количество заказа, которое является числовым значением, и идентификацию товара, которая может остаться строкой.

Используйте NSMutableDictionary, отображающий идентификацию элемента в числовое значение, представляющее текущее количество заказа, иначе извлеките старую сумму и добавьте к ней текущий заказ, а затем обновите словарь.

В конце выполните итерацию словаря и преобразуйте каждую пару ключ-значение обратно в строку.

Другие вопросы по тегам