Marco Almeida
Marco Almeida

Reputation: 1303

How to avoid duplicated objects being inserted in NSArray?

Well, I am having problems with an nsarray that it is adding duplicate objects from an nsdictionary.

The situation is this: I have a plist file with an array of dictionaries. Each dictionary have the key being 'codigo' and 'var'.

What I did is I am checking each 'var' value if it is < 0 and if it is 'codigo' and 'var' will get a color using NSAttributedStrings.

The problem comes when I iterate through the array and add the evaluated 'var' into the new array. I am getting duplicated objects in the final array.

EDIT: Solution derived from xlc0212's answer and help through chat:

_timer = [NSTimer scheduledTimerWithTimeInterval:0.020 target:self
                                        selector:@selector(time:) userInfo:nil repeats:YES];

NSDictionary *redAttrs    = @{NSForegroundColorAttributeName:[UIColor redColor]};
NSDictionary *greenAttrs  = @{NSForegroundColorAttributeName:[UIColor colorWithRed:0.118 green:0.506 blue:0.000 alpha:1.000]};
NSDictionary *orangeAttrs = @{NSForegroundColorAttributeName:[UIColor orangeColor]};

NSString *stringUm = @"";
NSString *stringDois = @"";
NSString *stringTres = @"";


arrayAtivos = [[NSMutableOrderedSet alloc] init];
NSDictionary *item = [[NSDictionary alloc]init];

for (item in array){

    NSString *alfa = [item objectForKey:@"var"];

    float fltNumber = [alfa floatValue];

    if (fltNumber < 0) {
        stringUm = [NSString stringWithFormat:@"%@ %.2f  ",[item objectForKey:@"codigo"], fltNumber];
        int strLength = [stringUm length];
        attStr = [[NSMutableAttributedString alloc] initWithString:stringUm];
        [attStr setAttributes:redAttrs range:NSMakeRange(0,strLength)];

    } else if (fltNumber > 0 ) {
        stringDois = [NSString stringWithFormat:@"%@ %.2f  ",[item objectForKey:@"codigo"], fltNumber];
        int strLength = [stringDois length];
        attStr = [[NSMutableAttributedString alloc] initWithString:stringDois];
        [attStr setAttributes:greenAttrs range:NSMakeRange(0,strLength)];

    } else if (fltNumber == 0) {
        stringTres = [NSString stringWithFormat:@"%@ %.2f  ",[item objectForKey:@"codigo"], fltNumber];
        int strLength = [stringTres length];
        attStr = [[NSMutableAttributedString alloc] initWithString:stringTres];
        [attStr setAttributes:orangeAttrs range:NSMakeRange(0,strLength)];
    }

    [arrayAtivos addObject:attStr];

}

Upvotes: 1

Views: 7014

Answers (3)

Bryan Chen
Bryan Chen

Reputation: 46578

NSMutableOrderedSet is what you want. Just replace NSMutableArray with NSMutableOrderedSet and done.

If you want to filter the array, use this

NSArray *array = // your array
NSMutableArray *filteredArray = [[[NSOrderedSet alloc] initWithArray: array] mutableCopy];

Replace

arrayAtivos = [NSMutableArray new];

with this

arrayAtivos = [[NSMutableOrderedSet alloc] init];

and change the type of arrayAtivos to NSMutableOrderedSet

Upvotes: 8

Firo
Firo

Reputation: 15566

If I understand this correctly you could just do a simple check before adding the objects into the array:

if (![arrayAtivos containsObject:attStr]) {
     [arrayAtivos addObject:attStr];
}

Upvotes: 3

Abizern
Abizern

Reputation: 150565

You could just add them all to an NSSet, which doesn't allow duplicates.

You can get an array from that, although you'll be responsible for sorting them if that is important.

Upvotes: 3

Related Questions