question de débutant à  propos de NSArray

Bonjour,


 


Je voudrais analyser un tableau et checker un doublon, si il y a un ou plusieurs éléments dupliqué dans le tableau, je voudrais sortir ces éléments dans un autre tableau.


 


J'ai réussi à  le faire mais je pense qu'il y a beaucoup plus simple (j'ai fait des boucles for en comparant les 2 mêmes tableau en décalant une itération).


 


Je vous remercie par avance.


Réponses

  • Salut,


     


    j'aurais fait ça :



    NSMutableSet *seenObjects = [NSMutableSet set];
    NSPredicate *dupPred = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind) {
    BOOL seen = [seenObjects containsObject:obj];
    if (!seen) {
    [seenObjects addObject:obj];
    }
    return !seen;
    }];
    NSArray *arrayToFilter = ... // c'est le tableau a filtrer
    arrayToFilter = [arrayToFilter filteredArrayUsingPredicate:dupObjectsPred];

    Dans le arrayToFilter tu vas avoir tous les objets sans les duplicates, et dans le seenObjects tu vas avoir les objets dupliqués mais pas en doublon :).( utilise un NSMutableArray au lieux de NSMutableSet si tu veux des doublons).


  • protocommprotocomm Membre
    septembre 2013 modifié #3

    merci, il est vrai que c'est de loin beaucoup plus simple que ma solution, je n'avais pas pensé à  "NSPredicate"


  • ça pourrait être également un truc comme ça



    NSArray *target = @[;@1, @2, @2, @3, @30, @10, @30, @3];


    NSMutableArray *dup = [NSMutableArray arrayWithCapacity:[target count]];
    NSMutableArray *analyzed = [NSMutableArray arrayWithCapacity:[target count]];

    [target enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([analyzed containsObject:obj]) {
    [dup addObject:obj];
    }
    else {
    [analyzed addObject:obj];
    }
    *stop = NO;
    }];


    NSLog(@%@", [dup description]);
  • protocommprotocomm Membre
    septembre 2013 modifié #5

    Je vous remercie de vos réponses, par contre il n'y a que la deuxième réponse qui est fonctionnelle, pouvez vous m'eclaircir sur le fonctionnement de la méthode de classe "predicateWithBlock: ^BOOL(id obj, NSDictionary *bind)", j'ai bien beau lire la doc apple mais faut avouer que je n'ai strictement rien compris.

  • Encore plus simple :



    NSArray *arrayToFilter = ... // tableau à  filtrer
    NSArray *filteredArray = [[NSSet setWithArray:arrayToFilter] allObjects];
  • Non 


     




     


    Encore plus simple :



    NSArray *arrayToFilter = ... // tableau à  filtrer
    NSArray *filteredArray = [[NSSet setWithArray:arrayToFilter] allObjects];



    Non ce n'est pas ce que je voulais, xyloweb m'a donné la bonne réponse, je ne veux que les doublons...mais merci quand même.


Connectez-vous ou Inscrivez-vous pour répondre.