NSMutableArray удалить повторяющиеся элементы - PullRequest
2 голосов
/ 05 сентября 2011
 NSLog(@"Ci sono %d categorie",category.count);
 for(int c=0; c<category.count; c++){
 CategoryArray * element =[category objectAtIndex:c];
 NSLog(@"******************************");
 NSLog(@"Titolo %@",element.label);
 NSLog(@"Source %@",element.url);
 NSLog(@"******************************");
 [element release];

Это мой код! Мне нужно удалить весь массив дубликатов ... Я использую этот код, но не понимаю, почему он не работает.

uniquearray = [[NSSet setWithArray:category] allObjects];

Ответы [ 5 ]

5 голосов
/ 05 сентября 2011

Ваш код работает. Попробуйте это:

NSArray *a = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", @"b", @"b", @"d", nil];
NSLog(@"a: %@\ndistinctA: %@", a, [[NSSet setWithArray:a] allObjects]);

Вывод:

a: (
    a,
    b,
    c,
    d,
    b,
    b,
    d
)
distinctA: (
    c,
    d,
    a,
    b
)

Зная, что код работает для массива, который содержит дубликаты объектов, теперь вам нужно задаться вопросом, почему объекты, которые вы считаете дубликатами, не считаются таковыми. Существующие ответы относительно хэша и isEqual указывают вам правильное направление.

2 голосов
/ 05 сентября 2011

Элементы внутри этого CategoryArray должны правильно реализовывать isEqual и хэш для NSSet объект, чтобы иметь возможность выяснить, какие из них являются дубликатами.

Другой SO-вопрос о переопределении isEqual и хэше вы можете найти здесь: Рекомендации по переопределению isEqual: и хеша

2 голосов
/ 05 сентября 2011

Набор не может содержать повторяющихся записей. Он использует хеш для их разделения и будет использовать isEqual, если хеш такой же (см. Комментарий Руди Велтуиса).

1 голос
/ 05 сентября 2011

вы можете использовать следующий код.

NSMutableArray* filterResults = [[NSMutableArray alloc] init];
BOOL copy;

if (![category count] == 0) {
    for (CategoryArray *a1 in category) {
        copy = YES;
        for (CategoryArray *a2 in filterResults) {
            if ([a1.label isEqualToString:a2.label] && [a1.url isEqualToString:a2.url]) {
                copy = NO;
                break;
            }
        }
        if (copy) {
        [filterResults addObject:a1];
        }
    }
}

И вы получите массив категорий без повторяющихся значений.
Вы можете увидеть Изменить код. Я думаю, что это будет работать.

0 голосов
/ 23 августа 2013

Если вы беспокоитесь о заказе, то вы можете сделать это следующим образом.

NSArray * newArray = [[NSOrderedSet orderSetWithArray: oldArray] array]; // iOS 5.0 и более поздние версии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...