我无法删除NSArray iphone中的重复对象

时间:2011-06-29 09:50:22

标签: iphone objective-c cocoa-touch nsmutablearray

我现在发疯了。我有一个带有一堆Person对象的NSMutableArray。我想删除重复的对象,但它不起作用。这就是我得到的:

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 个答案:

答案 0 :(得分:2)

您可能遇到Equals:方法的问题。当两个对象具有相同的散列时,它们是等于的。 isEquals: documentation

答案 1 :(得分:1)

如果您对副本的定义是两个单独的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];
    }      
}

答案 2 :(得分:0)

您确定具有相同名称的人确实是同一个对象(即指针指向同一个地址)吗?

答案 3 :(得分:0)

什么是人?任何自定义对象???如果是,则在该类中添加任何唯一ID,然后与该ID进行比较。

答案 4 :(得分:0)

尝试这个,我希望这可以帮到你

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

答案 5 :(得分:0)

嗯,你可以这样做:

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:来比较对象,这取决于您。将array1array2替换为您的两个数组,然后开始使用。

答案 6 :(得分:0)

一个班轮:uniqueArray = [[NSSet setWithArray:temp] allObjects];