检查NSMutableArray上的重复NSStrings

时间:2010-11-07 04:03:33

标签: objective-c cocoa nsstring nsarray duplicates

我有一个NSMutableArray,我想添加字符串。在将字符串添加到数组之前,我需要检查数组中是否已存在该字符串。无论如何知道这样做的好方法吗?

谢谢!

3 个答案:

答案 0 :(得分:8)

如果顺序无关紧要,最简单的方法是切换到使用NSMutableSet。集合是无序的,NSSets和NSMutableSets只能包含每个对象一次。只有一个计数集(NSCountedSet)可以多次包含同一个对象。

如果顺序很重要,请继续使用NSMutableArray,并在添加之前使用-containsObject:检查该对象是否已存在。


编辑:至于Lion,我们现在有NSOrderedSet和NSMutableOrderedSet!巧克力在我的花生酱中!我的巧克力中的花生酱!

与无序集合一样,您可以获得快速的成员资格测试,禁止重复,以及设置操作(联合,交集等)。与数组一样,您可以获得有序访问,包括可靠顺序枚举和索引访问。

因此,如果您需要拒绝重复但同时保留顺序,Lion的NS {,Mutable} OrderedSet类适合您。

答案 1 :(得分:1)

如果您只想做一次您所说的话,请使用containsObject:,如

if (![myArray containsObject:theObject]) [myArray addObject:theObject];

请注意,这会对数组进行线性搜索,因此如果您要大量使用此操作,则不适合。如果您是,并且您不需要订购,则应使用NSSet。如果您确实需要订购,则可以使用保持同步的NSArrayNSSet(例如,始终同时在两个集合中添加/删除相同的对象)。

答案 2 :(得分:0)

我更喜欢在here

中描述的NSPredicate

简而言之

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"Ben", @"Adam", @"Melissa", nil];

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", your_search_key];
NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate];

if ([beginWithB count] > 0)
{
    //Handle duplicate
}