я не могу удалить дубликаты объектов в iphone NSArray - PullRequest
0 голосов
/ 29 июня 2011

Я схожу с ума прямо сейчас. У меня есть NSMutableArray с кучей объектов Person. Я хочу удалить дублированные объекты, но это не сработает. Вот что я получил:

NSMutableArray *withoutDoubles =[[NSMutableArray alloc]init];
    NSArray *temp = [[NSArray alloc] initWithArray:tempResults];
    for (Person *person in temp) {
        if(![withoutDoubles containsObject:person]) {
            [withoutDoubles addObject:person];
        }       
    }
    for (Person *person in withoutDoubles) {
         NSLog(@"----> %@",person.name);
    }

Это не работает, у меня все еще есть дубликаты. Я также попробовал:

NSArray *temp = [[NSArray alloc] initWithArray:tempResults];
NSSet *set = [NSSet setWithArray:temp];

Но это тоже не сработало. Мне нужно немного помощи здесь.

Заранее спасибо.

Ответы [ 7 ]

2 голосов
/ 29 июня 2011

У вас могут быть проблемы с методом isEquals :. Два объекта равны, когда оба имеют одинаковый хэш. isEquals: документация

1 голос
/ 29 июня 2011

Если ваше определение дубликата - это два отдельных объекта Person, свойства которых установлены одинаково, то лучший способ добиться этого - переопределить эти два метода в вашем объекте Person

- (BOOL)isEqual:(id)anObject
- (NSUInteger)hash

, который позволит вамдля правильного сравнения.

Затем вам нужно будет сделать следующее

for (Person *personToTest in temp) {
    BOOL duplicate = NO;
    for (Person *person in withoutDoubles) {
        if ([personToTest isEqual:person]) {
            duplicate = YES;
            break;
        }
    }
    if (!duplicate) {
        [withoutDoubles addObject:personToTest];
    }      
}
0 голосов
/ 11 августа 2011

Один лайнер: uniqueArray = [[NSSet setWithArray:temp] allObjects];

0 голосов
/ 29 июня 2011

Ну, вы можете просто сделать это так:

NSMutableArray*array1 = [NSMutableArray arrayWithObjects:person,person1,person2,nil];
NSMutableArray*array2 = [NSMutableArray arrayWithObjects:person1,person2,person,nil];

for (Person*person in array1)
{
    if ([array2 containsObject:person])
    {
         [array2 removeObject:person];
    }
}

Это удалит все дубликаты, найденные в array2.Вы также можете использовать isEqual: для сравнения объектов, это ваше дело.Замените array1 и array2 двумя массивами и попробуйте.

0 голосов
/ 29 июня 2011

Попробуйте это, я надеюсь, что это может помочь вам

    NSArray *copy = [mutableArray copy];
NSInteger index = [copy count] - 1;
for (id object in [copy reverseObjectEnumerator]) {
    if ([mutableArray indexOfObject:object inRange:NSMakeRange(0, index)] != NSNotFound) {
        [mutableArray removeObjectAtIndex:index];
    }
    index--;
}
[copy release];
0 голосов
/ 29 июня 2011

что такое человек?любой пользовательский объект ???если так, то добавьте любой уникальный идентификатор в этот класс, а затем сравните с этим идентификатором.

0 голосов
/ 29 июня 2011

Вы уверены, что лица с одинаковыми именами действительно являются одним и тем же объектом (т. Е. Указатель указывает на один и тот же адрес)?

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