【发布时间】:2011-05-06 05:03:41
【问题描述】:
我有一个 NSMutableArray,我想在其中添加字符串。在将字符串添加到数组之前,我需要检查该字符串是否已存在于数组中。无论如何知道一个好方法吗?
谢谢!
【问题讨论】:
标签: objective-c cocoa nsstring nsarray duplicates
我有一个 NSMutableArray,我想在其中添加字符串。在将字符串添加到数组之前,我需要检查该字符串是否已存在于数组中。无论如何知道一个好方法吗?
谢谢!
【问题讨论】:
标签: objective-c cocoa nsstring nsarray duplicates
如果顺序无关紧要,最简单的方法是切换到使用 NSMutableSet。集合是无序的,NSSet 和 NSMutableSet 只能包含每个对象一次。只有一个计数集(NSCountedSet)可以多次包含同一个对象。
如果顺序确实重要,请继续使用 NSMutableArray,并在添加之前使用-containsObject: 检查对象是否已存在。
编辑:从 Lion 开始,我们现在拥有 NSOrderedSet 和 NSMutableOrderedSet!我的花生酱里有巧克力!我的巧克力里有花生酱!
就像无序集合一样,您可以获得快速的成员资格测试、禁止重复,当然还有集合操作(联合、交集等)。像数组一样,您可以获得有序访问,包括可靠顺序枚举和按索引访问。
因此,如果您需要拒绝重复但同时保持顺序,Lion 的 NS{,Mutable}OrderedSet 类适合您。
【讨论】:
如果你只想做你曾经说过的事情,只需使用containsObject:,如
if (![myArray containsObject:theObject]) [myArray addObject:theObject];
请注意,这会在数组中进行线性搜索,因此如果您要经常使用此操作,则不合适。如果是,并且不需要订购,则应使用NSSet。如果您确实需要订购,您可以同时使用保持同步的 NSArray 和 NSSet(例如,始终同时从两个集合中添加/删除相同的对象)。
【讨论】:
hash 值然后询问它们是否相等 (isEqual:) 来执行的。 developer.apple.com/mac/library/documentation/Cocoa/Reference/…
-hash 或 -isEqual: 方法。
-containsObject: 绝对不检查引用指针;那是-indexOfObjectIdenticalTo: 的工作
-[NSArray conainsObject:] 的文档更加具体,并明确指出它依赖于 -hash 和 -isEqual:。如果您使用的是 NSSet,则可以使用 -member: 而不是 -containsObject: 如果您想确定它正在执行相等性测试。
我更喜欢 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
}
【讨论】: