嗨我的NSArray包含这样的重复项(我必须删除重复项)
标题:父亲节 标题:父亲节 标题:父亲节 标题:选举日 标题:选举日 标题:选举日 标题:复活节 标题:复活节 标题:地球日 标题:地球日 标题:地球日标题:Cinco de Mayo
标题:Cinco de Mayo
标题:Cinco de Mayo
标题:平安夜 标题:平安夜 标题:平安夜 标题:圣诞节 标题:圣诞节 标题:圣诞节我只保留一个名字,不需要其他副本。 我怎么做这个请指导我一点清楚解释,解决这个问题。 谢谢。
答案 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]);
}