Iphone 限制NSArray中的重复条目

Iphone 限制NSArray中的重复条目,iphone,Iphone,我有一个数组,其中包含一些重复的条目 首先,在插入数据时是否有任何方法限制重复条目 其次,如果一个数组已经有了重复的值,那么我们只能从该数组中检索唯一的值,我听说过NSSet,但我不知道如何使用它。如果你听说过NSSet,你读过吗?该API类似于NSArray,非常简单。就像NSArray与NSMutableArray一样,如果需要即时成员资格测试,您可以使用NSMutableSet。不要使用NSSet 只能在创建时插入元素,不能在创建后更改包含的元素 如果要动态添加和删除对象,可以使用 这里演

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

首先,在插入数据时是否有任何方法限制重复条目


其次,如果一个数组已经有了重复的值,那么我们只能从该数组中检索唯一的值,我听说过NSSet,但我不知道如何使用它。

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

不要使用NSSet

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

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

这里演示了如何同时使用NSSetNSMutableSet,然后将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:
    ,使用
    NSMutableArray
    复制集合功能(可行,但可能很慢,因为数组有O(n)个搜索时间)
  • 使用另一个对象

如果您选择第二个选项,我建议您看看优秀的框架,它有一个子类
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++;
    }
}