首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone sdk:如何在NSArray中删除重复项

iPhone sdk:如何在NSArray中删除重复项
EN

Stack Overflow用户
提问于 2011-03-12 15:32:16
回答 3查看 3.9K关注 0票数 1

嗨,我的NSArray包含这样的重复项(我必须删除重复项)

标题:父亲节

标题:父亲节

标题:父亲节

标题:选举日

标题:选举日

标题:选举日

标题:复活节

标题:复活节

标题:地球日

标题:地球日

标题:地球日

片名: Cinco de Mayo

片名: Cinco de Mayo

片名: Cinco de Mayo

标题:平安夜

标题:平安夜

标题:平安夜

标题:圣诞节标题:圣诞节标题:圣诞节

我只保留了一个名字,不需要其他重复的名字。我是如何做到这一点的,请指导我一点清楚的解释,以解决这个问题。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2011-03-12 15:37:55

如果你关心排序,你可以创建一个新的可变数组,遍历旧数组中的每个对象,只有当它不存在时才添加它:

代码语言:javascript
复制
NSMutableArray *uniqueItems = [NSMutableArray array];
for (id item in allItems)
    if (![uniqueItems containsObject:item])
        [uniqueItems addObject:item];

如果不是这样,那么只使用set会简单得多:

代码语言:javascript
复制
NSSet *uniqueItems = [NSSet setWithArray:allItems];
票数 7
EN

Stack Overflow用户

发布于 2011-03-14 03:54:24

您希望消除重复数据的NSArray是否已排序?从你的问题看似乎是这样的。在这种情况下,可以使用以下代码:

代码语言:javascript
复制
NSMutableArray *uniqueItems = [NSMutableArray array];

id lastSeenUniqueObject = nil;

for (NSObject *item in allItems) {
    if (![item isEqual:lastSeenUniqueObject]) {
        [uniqueItems addObject:item];
        lastSeenUniqueObject = item;
    }
}

与rpetrich的答案的(大约) N^2复杂度相比,这具有N(即快速)的运行时复杂度。

如果您不知道Array的内容是排序的,那么您有两个选择:

A)只需对其进行排序,然后应用上面的算法,这就给出了n log n运行时的复杂性(仍然比N^2好得多),

B)使用NSMutableSet来跟踪已经看到的对象(或使用存储桶和散列的任何其他数据结构)。代码将如下所示:

代码语言:javascript
复制
NSMutableArray *uniqueItems = [NSMutableArray array];

NSMutableSet *seenItems = [NSMutableSet set];

for (NSObject *item in allItems) {
    if (![seenItems containsObject:item]) {
        [uniqueItems addObject:item];
        [seenItems addOBject:item];
    }
}

这也提供了比N^2更好的运行时。

票数 2
EN

Stack Overflow用户

发布于 2011-03-12 16:28:45

看看这个简单的..

代码语言:javascript
复制
NSMutableArray *dateArray = [[NSMutableArray alloc]initWithObjects:@"December 29,2010", 
                             @"December 28,2010",
                             @"December 22,2010",
                             @"December 22,2010",
                             @"December 22,2010",@"December 21,2010",@"December 28,2010",nil];

为了避免重复使用,请使用此...

代码语言:javascript
复制
NSSet *cleanedArray = [NSSet setWithArray:dateArray];
NSArray *array = [[NSArray alloc]initWithArray:[cleanedArray allObjects]];

for (int i=0; i<[array count]; i++) {
    NSLog(@"The Given Array is %@",[array objectAtIndex:i]);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5281295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档