2012-08-10 12 views
1

J'ai un dictionnaire avec un tableau de commandes avec le montant et les commandes dans ce Orders = ("3 White Shirts", "8 White Shirts", "4 blue shorts")Comment faire une boucle à travers et ajouter des doublons dans un tableau

Comment puis-boucle I à et ajouter le montant des commandes en double afin que la chaîne de résultat ou un tableau serait Orders = ("11 White Shirts", "4 blue shorts") or myString ="11 White Shirts, 4 blue shorts"

Je pense une sorte de sous-chaîne pour vérifier si les produits sont les mêmes, mais ne savez pas comment capturer la quantité correcte d'ajouter de l'ordre en double

Un grand merci

Répondre

2

Ok ici est une façon de le faire (la plus courte que je pouvais penser):

// 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]; 
    } 
} 

cela vous donne un dict comme ceci:

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

Ainsi, vous pouvez parcourir les clés et produire un tableau de chaînes comme ceci:

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

Ce qui finalement vous donnera:

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

PS. N'oubliez pas de libérer si vous n'utilisez pas ARC!

+0

Wow, je suis profondément humiliée ..... cela a fonctionné magnifiquement et j'ai appris une tonne ... J'étais sur le point de me lancer dans un code très moche par moi-même ... Je ne sais pas ce que je ferais sans la communauté SO .... Je suppose que j'écris du code moche. Merci beaucoup. – AhabLives

0

Vous devez analyser les chaînes pour extraire les deux informations: la quantité de commande, qui est une valeur numérique, et l'identification de l'article, qui peut rester une chaîne.

Utilisez un NSMutableDictionary mappant l'identification de l'élément à une valeur numérique représentant la quantité de commande actuelle, sinon récupérez l'ancien total et ajoutez-y l'ordre actuel, puis mettez à jour le dictionnaire. A la fin, itérer le dictionnaire et transformer chaque paire valeur/clé en une chaîne.

+0

pas sûr que j'ai jamais entendu parler de cartographie Dictionay utilisé avoir un exemple simple de lien que je peux lire sur? Merci – AhabLives

0

Comme il ressemble à votre tableau contient des objets chaîne, je ferais quelque chose comme ceci:

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

Utiliser 'allKeys:', puis analyser ce tableau est très inefficace. Appelez juste 'objectForKey:' et si vous obtenez 'nil' cela signifie que la clé n'était pas là. –

Questions connexes