views:

1915

answers:

3

I'm currently enumerating through NSMutableArray (or NSMutableSet) elements to find duplicates and remove them.

For example, if array/set has values [@"a", @"b", @"b", @"c"], the end result should be [@"a", @"b", @"c"].

Since I'm comparing NSStrings, I'm using isEqualTo: method to check if strings are equal.

Is there a more efficient way to do remove duplicate entries than to loop through all of them and check if duplicate exists?

+1  A: 

A set never contains duplicate elements, so simply creating an NSMutableSet should guarantee uniqueness of values.

Daniel Dickison
Thanks for answer Daniel!
Rudi
+7  A: 

An NSSet does exactly what you're trying to do: it is a (unordered) collection of unique items. So, you can find the unique items in your array like so:

NSSet *uniqueElements = [NSSet setWithArray:myArray];

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

NSSet most likely uses a hash algorithm to make insertion O(1) (compared to O(n^2) to check if each item is unique by iteration), but the Apple documentation does not make such a guarantee so you probably shouldn't count on that implementation detail.

If, for some reason you need to keep the unique items in a sorted (ordered) collection, you can turn the set back into an array with -[NSSet allObjects] and then sort the resulting array.

Barry Wark
Thank you, that worked! I did this to get unique elements in the array:// add to set to check for unique element namesNSSet *uniqueNames = [NSSet setWithArray:names]; // return data back to the arraynames = [[NSMutableArray alloc] initWithArray:[uniqueNames allObjects]];
Rudi
The more cannonical way to get back to the array names would be:id names = [[uniqueNames allObjects] retain]; //if you want to keep namesorid names = [uniqueNames allObjects]; //if you don't want to retain ownership of the array
Barry Wark
+1  A: 

An NSSet or NSMutableSet will guarantee that you don't have duplicate objects. It will work for NSStrings as in your example, but for your own classes keep in mind what do you mean by "equal" and implement the hash and isEqual: methods accordingly.

Marco Mustapic
Thank you for the explanation, it's good to know that it's automatic for NSStrings.
Rudi