NSMutableArray删除重复的项目

时间:2011-09-05 12:08:11

标签: iphone objective-c nsmutablearray

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

答案 0 :(得分:5)

您的代码确实有效。试试这个:

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
)

知道代码适用于包含重复对象的数组,您现在不得不想知道为什么您认为重复的对象不被认为是如此。关于hash和isEqual的现有答案指出了你正确的方向。

答案 1 :(得分:2)

设置不能包含任何重复记录。它使用散列来区分它们,如果散列相同则使用isEqual(参见Rudy Velthuis的评论)。

答案 2 :(得分:2)

CategoryArray 中的元素必须正确实现 NSSet <的 isEqual hash / strong>能够找出哪些是重复的对象。

你可以在这里看到另一个关于覆盖isEqual和hash的问题:Best practices for overriding isEqual: and hash

答案 3 :(得分:1)

您可以使用以下代码。

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

您将获得没有重复值的类别数组 您可以看到修改代码。我认为这会奏效。

答案 4 :(得分:0)

如果您担心订单,那么您可以这样做。

NSArray * newArray = [[NSOrderedSet orderedSetWithArray:oldArray] array]; // iOS 5.0及更高版本