在NSArray中去除重复项

13

我如何在NSArray中去除重复项。例如,我的数组包含以下数据。我想与相邻日期进行比较以避免重复,但它会报错。

有谁能指导我做错了什么

首先是日历 -

( 
2010-09-25 17:00:00 GMT,
"AAA",
2010-09-25 17:00:00 GMT,
"AAA",
2010-09-26 17:00:00 GMT,
"BBB",
2010-09-26 17:00:00 GMT,
"BBB",
2010-09-27 17:00:00 GMT,
"CCCC",
2010-09-27 17:00:00 GMT,
"CCC",
2010-09-28 17:00:00 GMT,
"AAA",
2010-09-28 17:00:00 GMT,
"AAA",
2010-09-29 17:00:00 GMT,
"DDDD",
2010-09-29 17:00:00 GMT,
"DDDD",
2010-09-30 17:00:00 GMT,
"BBBB"
)

我的代码

NSArray dates; //dates contain above values
NSMutableArray *temp_date = [[NSMutableArray alloc] init];

for (int i=0; i<[dates count]; i+=2){
    BOOL day;

    if ([dates count]-2 >i) {
        day = [[dates objectAtIndex:i] compare:[dates objectAtIndex:i+2]];
    }   

    if (day) {
        [temp_date addObject:[dates objectAtIndex:i]];
        [temp_date addObject:[dates objectAtIndex:i+1] ];
    }
}

敬礼, Sathish


你尝试了什么?你遇到了什么错误? - willcodejavaforfood
我在我的帖子中添加了代码。 - sathish kumar
你是想说数组里全是字符串吗?还是交替包含了NSDate和字符串? - Sam Dufel
您可以使用NSObject的isEqual方法,用于比较对象内容的相等性。 - iOSPawan
兄弟,恕我直言,这里存在一个概念上的错误。问题在于,如果你需要一个不重复的NSArray,实际上你真正需要的是一个NSSet。有时候我们只是太习惯于使用某个数据结构,而没有考虑应用程序的真正需求。 - Leandro
4个回答

48

你可以使用集合(sets)。重复的元素在创建时将自动被删除。

NSArray *cleanedArray = [[NSSet setWithArray:dates] allObjects];
请注意,集合是无序的。 根据Brent的评论,一个更近期的解决方案可以让你保持元素的顺序。
[[NSOrderedSet orderedSetWithArray:dates] array]

Joseph的问题是,他有一个日期为2D数组[[日期1-值],[日期1-值],[日期2-值]],我需要单独删除重复的日期,并且相应的值应该保持不变。我指的是数组具有连续的值(日期,值,日期,值等)。 - sathish kumar
你想每个日期最终只有一个值吗?或者如果值不同,一个日期可以在数组中出现多次吗? - Joseph Tura
1
把这两个值(日期和状态)放在一个对象中,将其放入数组中,然后使用NSSet去除重复项,这样怎么样? - Joseph Tura
4
如果你的目标是 iOS 5 或更高版本,或者 Lion 或更高版本,现在可以使用 [[NSOrderedSet orderedSetWithArray:dates] array] 来去重一个数组,并保留其元素的顺序。(我认为它会将每个重复的元素保留在第一个索引处,但我不确定。) - Becca Royal-Gordon
@JosephTura 你能编辑你的回答并加上Brent的评论吗?这将对他人有用。 - Aravindhan
显示剩余2条评论

9

最干净的方式

NSArray *没有重复日期 = [dates valueForKeyPath:@"@distinctUnionOfObjects.self"];


(注:该段内容为Objective-C语言中的代码,用于从一个数组中获取去重后的日期数组。)

这很漂亮。谢谢。 - Craig Smith

1

如果您使用了mutableArray,请使用此方法。

NSArray *copy = [mutableArray copy];

NSInteger index = [copy count] - 1;

for (id object in [copy reverseObjectEnumerator]) {

    if ([mutableArray indexOfObject:object inRange:NSMakeRange(0, index)] != NSNotFound) {
        [mutableArray removeObjectAtIndex:index];
    }
    index--;
}
[copy release];

1

要查找相同的对象,最好使用–indexOfObjectIdenticalTo:–indexOfObjectIdenticalTo:inRange:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接