2009-07-21 63 views
16

我目前正在通过NSMutableArray(或NSMutableSet)元素来查找重复项并将其删除。制作唯一的NSMutableArray或NSMutableSet

例如,如果array/set的值为[@"a", @"b", @"b", @"c"],则最终结果应为[@"a", @"b", @"c"]

由于我在比较NSStrings,我使用isEqualTo:方法来检查字符串是否相等。

是否有一个更有效的方法来删除重复的条目,而不是循环遍历所有这些并检查是否存在重复?

回答

42

NSSet完全符合您的要求:它是一个(无序的)独特项目集合。所以,你可以找到你的数组中的唯一项目,像这样:

NSSet *uniqueElements = [NSSet setWithArray:myArray]; 

// iterate over the unique items 
for(id element in uniqueElements) { 
    // do something 
} 

NSSet最有可能使用的哈希算法,使插入O(1)(相比于为O(n^2)检查,如果每个项目独特的迭代),但苹果文档不作出这样的保证,所以你可能不应该指望实现细节。

如果出于某种原因需要将唯一项保存在已排序(排序)的集合中,则可以使用-[NSSet allObjects]将该集重新转换为数组,然后对结果数组进行排序。

+0

谢谢你,工作!我这样做是为了获得数组中的唯一元素: //添加设置以检查唯一元素名称 NSSet * uniqueNames = [NSSet setWithArray:names]; \t //将数据返回给数组 names = [[NSMutableArray alloc] initWithArray:[uniqueNames allObjects]]; – Rudi 2009-07-22 04:44:20

+0

返回数组名称的更强大的方法是: id names = [[uniqueNames allObjects] retain]; //如果你想保留名字 或 id names = [uniqueNames allObjects]; //如果你不想保留数组的所有权 – 2009-07-22 05:16:12

3

一组永远不会包含重复的元素,所以简单地创建一个NSMutableSet应该保证值的唯一性。

+0

感谢您的回答丹尼尔! – Rudi 2009-07-22 04:45:55

4

一个NSSetNSMutableSet将保证你没有重复的对象。它将在您的示例中适用于NSStrings,但对于您自己的课程,请记住“平等”是什么意思,并相应地实施hashisEqual:方法。

1

只有这行代码才能正常工作。

NSSet *mySet = [NSSet setWithArray:myArray]; 

现在mySet将有独特的元素。