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

时间:2011-03-12 07:32:16

标签: iphone objective-c nsarray

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

标题:父亲节

标题:父亲节

标题:父亲节

标题:选举日

标题:选举日

标题:选举日

标题:复活节

标题:复活节

标题:地球日

标题:地球日

标题:地球日

标题:Cinco de Mayo

标题:Cinco de Mayo

标题:Cinco de Mayo

标题:平安夜

标题:平安夜

标题:平安夜

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

我只保留一个名字,不需要其他副本。 我怎么做这个请指导我一点清楚解释,解决这个问题。 谢谢。

3 个答案:

答案 0 :(得分:7)

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

NSMutableArray *uniqueItems = [NSMutableArray array];
for (id item in allItems)
    if (![uniqueItems containsObject:item])
        [uniqueItems addObject:item];

如果没有,只使用一套就更简单了:

NSSet *uniqueItems = [NSSet setWithArray:allItems];

答案 1 :(得分:2)

您希望重复数据删除的NSArray已经排序了吗?你的问题似乎如此。在这种情况下,以下代码将执行:

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跟踪已经看过的对象(或使用存储桶和散列的任何其他数据结构)。代码如下:

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 :(得分:0)

看到这个简单..

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];

避免重复使用此...

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]);
}