我有一个数组,其中包含一些重复的条目。
首先,有没有办法在插入数据时限制重复条目?
其次,如果一个数组已经具有重复值而不是其他方式,我们只能从该数组中检索唯一值,我听说过关于此的NSSet,但我不知道如何使用它。
答案 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。