Search code examples
objective-ciosnsarraynsset

NSSet: return an NSArray of objects sorted by a list of strings on certain property of each object?


I have an NSSet of objects.

Each object in the set is an instance of MyObject with a property called name.

I have another NSArray called nameIndexes which contains name values.

I would like to have a function that takes the NSSet and returns a sorted array sorted using the name property based on its position in the nameIndexes array.

Edit:

Sorry for my misleading, here is an example:

I have a set of MyObject(may not be in the same order):

MyObject1 {name:@"A"}

MyObject2 {name:@"B"}

MyObject3 {name:@"C"}

I have another array of names:

{"B", "A", "C"}

I want an NSArray of:

{MyObject2, MyObject1, MyObject3}

Solution

  • NSSet *set = //your set.
    
    NSArray *nameIndexes = //the array of names for sorting.
    
    NSArray *result = [[set allObjects] sortedArrayUsingComparator:^NSComparisonResult(MyObject *obj1, MyObject *obj2) {
        int index1 = [nameIndexes indexOfObject:obj1.name];
        int index2 = [nameIndexes indexOfObject:obj2.name];
        return [[NSNumber numberWithInt:index1] compare:[NSNumber numberWithInt:index2]];
    }];
    

    Not 100% certain what you are asking but this will sort take the set of names and turn it into a sorted array sorted based on the index of the names in a second array.

    After edit

    Edit... ok, so your edit completely changed the question. Anyway, from the edit you can just do...

    NSArray *result = [[set allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:"name" ascending:YES]]];
    

    This will take the set and return a sorted array sorted by the name property of the objects in alphabetical order.