限制NSArray中的重复条目

时间:2010-09-13 05:30:19

标签: iphone

我有一个数组,其中包含一些重复的条目。

首先,有没有办法在插入数据时限制重复条目?

其次,如果一个数组已经具有重复值而不是其他方式,我们只能从该数组中检索唯一值,我听说过关于此的NSSet,但我不知道如何使用它。

3 个答案:

答案 0 :(得分:13)

不要使用NSSet

您只能在创建时插入元素,并且不能更改创建后包含的元素。

如果您想动态添加和删除对象,可以使用NSMutableSet

以下是如何使用 NSSet NSMutableSet ,然后将 NSSet 转换回 NSArray <的演示/ strong>(如果你想这样做):

- (void) NSMutableSetPrintTest
{
    NSMutableSet *mutableSet = [[NSMutableSet alloc] init];

    NSLog(@"Adding 5 objects (3 are duplicates) to NSMutableSet");
    NSString *firstString = @"Hello World";
    [mutableSet addObject:firstString];
    [mutableSet addObject:@"Hello World"];
    [mutableSet addObject:@"Goodbye World"];
    [mutableSet addObject:@"Goodbye World"];
    [mutableSet addObject:@"Goodbye World"];

    NSLog(@"NSMutableSet now contains %d objects:", [mutableSet count]);
    int j = 0;
    for (NSString *string in mutableSet) {
        NSLog(@"%d: %@ <%p>", j, string, string);
        j++;
    }

    NSLog(@"Now, if we are done adding and removing things (and only want to check what is in the Set) we should convert to an NSSet for increased performance.");
    NSSet *immutableSet = [NSSet setWithSet:mutableSet];

    NSLog(@"NSSet now contains %d objects:", [immutableSet count]);
    int i = 0;
    for (NSString *string in immutableSet) {
        NSLog(@"%d: %@ <%p>", i, string, string);
        i++;
    }

    [mutableSet release]; mutableSet = nil;

    NSLog(@"Now, if we are done with the sets, we can convert them back to an NSArray:");
    NSArray *array = [immutableSet allObjects];

    NSLog(@"NSArray contains %d objects", [array count]);
    int k = 0;
    for (NSString *string in array) {
        NSLog(@"%d: %@ <%p>", k, string, string);
        k++;
    }
}

答案 1 :(得分:9)

NSMutableSet可能是最合理的用法。

但是,请注意,集合不维护其元素的顺序(因为根据定义,集合是无序的)。

如果这对您来说有问题,那么您有几个选择:

  • 通过在NSMutableArray每次调用之前调用containsObject:来复制addObject:的集合功能(可行,但可能很慢,因为数组有O(n)搜索时间)
  • 使用其他物品。

如果您选择第二个选项,我建议您查看优秀的CHDataStructures框架,该框架的子类NSMutableSet名为CHOrderedSet,这是一个维护的集合插入顺序。 (因为它是一个子类,它具有与NSMutableSet完全相同的API)

答案 2 :(得分:5)

如果你听说过NSSet,你读过the documentation吗? API与NSArray类似,非常简单。就像NSArray与NSMutableArray一样,如果你需要动态成员资格测试,你可以使用NSMutableSet。