Iphone 限制NSArray中的重复条目
我有一个数组,其中包含一些重复的条目 首先,在插入数据时是否有任何方法限制重复条目Iphone 限制NSArray中的重复条目,iphone,Iphone,我有一个数组,其中包含一些重复的条目 首先,在插入数据时是否有任何方法限制重复条目 其次,如果一个数组已经有了重复的值,那么我们只能从该数组中检索唯一的值,我听说过NSSet,但我不知道如何使用它。如果你听说过NSSet,你读过吗?该API类似于NSArray,非常简单。就像NSArray与NSMutableArray一样,如果需要即时成员资格测试,您可以使用NSMutableSet。不要使用NSSet 只能在创建时插入元素,不能在创建后更改包含的元素 如果要动态添加和删除对象,可以使用 这里演
其次,如果一个数组已经有了重复的值,那么我们只能从该数组中检索唯一的值,我听说过NSSet,但我不知道如何使用它。如果你听说过NSSet,你读过吗?该API类似于NSArray,非常简单。就像NSArray与NSMutableArray一样,如果需要即时成员资格测试,您可以使用NSMutableSet。不要使用NSSet 只能在创建时插入元素,不能在创建后更改包含的元素 如果要动态添加和删除对象,可以使用 这里演示了如何同时使用NSSet和NSMutableSet,然后将NSSet转换回NSArray(如果您想这样做):
-(void)NSMutableSetPrintTest
{
NSMutableSet*mutableSet=[[NSMutableSet alloc]init];
NSLog(@“向NSMutableSet添加5个对象(3个是重复的”);
NSString*firstString=@“你好世界”;
[mutableSet-addObject:firstString];
[mutableSet addObject:@“Hello World”];
[mutableSet addObject:@“再见世界”];
[mutableSet addObject:@“再见世界”];
[mutableSet addObject:@“再见世界”];
NSLog(@“NSMutableSet现在包含%d个对象:”,[mutableSet count]);
int j=0;
for(NSString*可变表集中的字符串){
NSLog(@“%d:%@”,j,字符串,字符串);
j++;
}
NSLog(@“现在,如果我们完成了添加和删除操作(并且只想检查集合中的内容),我们应该转换为NSSet以提高性能。”);
NSSet*immutableSet=[NSSet setWithSet:mutableSet];
NSLog(@“NSSet现在包含%d个对象:,[immutableSet count]);
int i=0;
for(immutableSet中的NSString*字符串){
NSLog(@“%d:%@”,i,string,string);
i++;
}
[mutableSet release];mutableSet=nil;
NSLog(@“现在,如果我们处理完这些集合,我们可以将它们转换回NSArray:”;
NSArray*数组=[immutableSet AllObject];
NSLog(@“NSArray包含%d个对象,[array count]);
int k=0;
for(NSString*数组中的字符串){
NSLog(@“%d:%@”,k,string,string);
k++;
}
}
NSMutableSet
可能是最合理的使用方法
但是,请注意,集合并不保持其元素的顺序(因为集合根据定义是无序的)
如果这对你来说是个问题,那么你有两个选择:
- 通过在每次调用
之前调用addObject:
,使用containsObject:
复制集合功能(可行,但可能很慢,因为数组有O(n)个搜索时间)NSMutableArray
- 使用另一个对象
如果您选择第二个选项,我建议您看看优秀的框架,它有一个子类
NSMutableSet
,名为chordedset
,这是一个维护插入顺序的集合。(由于它是一个子类,它的API与NSMutableSet
)完全相同。如果(![AppDelegate.coffeeArray containsObject:coffeeObj.message]){[AppDelegate.coffeeArray addObject:coffeeObj];//不包含。}这是限制重复值的更好方法吗???为什么会得到这么多的投票?我的答案显示了如何在代码中实现这一点,因为如果有人知道如何使用NSArray,他们应该能够使用NSSet。这是OP不使用最基本的现有资源的一个非常明显的例子。(如果你的代码有效,我会给你投票,但是copy
一个集合返回一个集合。不过,给人一条鱼还是教人钓鱼)。@bbum:我同意你的观点,但是你的回答花了10秒钟。我的花了10分钟来编码、编译和检查。这是努力与回报的对比。信不信由你,我很长一段时间都知道如何使用NSArray
,但却不知道NSSet
(甚至不知道它存在)。记住,不是每个人都像他们“应该”那样专业。无论如何,为投票欢呼@bbum.Haha哦,我忘了当你呼叫copy
时,推荐人通过了受让人。更新…好的,很好,我在mutableSet中得到了唯一的值,而不是如何将元素从这个mutableSet复制到另一个数组,比如数组b???我的代码已经向您展示了如何做到这一点:NSArray*b=[mutableSet copy]密码>附言:如果我的答案对你有帮助,你可以把它标记为正确。干杯,来吧--“如何将元素从集合复制到数组??”。请参阅NSSet文档。与双击NSSet并向下滚动到方法列表以查看allObjects
@bbum是否正确相比,编写该注释可能需要更长的时间,尽管在这种特殊情况下,由于duck键入(-count
和
在数组和集合上都存在),该注释仍然有效<代码>[immutableSet AllObject]
返回一个NSArray
。我已经更新了我的答案。我也删除了不必要的dealloc
。
- (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++;
}
}