Как перебрать и добавить дубликаты в массив
У меня есть словарь с массивом заказов с количеством и заказами в нем 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, отображающий идентификацию элемента в числовое значение, представляющее текущее количество заказа, иначе извлеките старую сумму и добавьте к ней текущий заказ, а затем обновите словарь.
В конце выполните итерацию словаря и преобразуйте каждую пару ключ-значение обратно в строку.