基于两个参数的排序数组

时间:2013-06-24 02:47:22

标签: ios objective-c cocoa-touch

我有一个由两个属性组成的对象数组:NSStringBOOL。我想对此数组进行排序,以便所有BOOL YES出现在所有NO的bool之前。然后我想要对BOOL YES按字母顺序排列的对象列表,我也希望将NO的对象按字母顺序排列。是否有某种类型的库可以在目标c中实现这一目标?如果不是最有效的方法是什么?

3 个答案:

答案 0 :(得分:21)

您可以使用NSSortDescriptor来进行排序:

// Set ascending:NO so that "YES" would appear ahead of "NO"
NSSortDescriptor *boolDescr = [[NSSortDescriptor alloc] initWithKey:@"boolField" ascending:NO];
// String are alphabetized in ascending order
NSSortDescriptor *strDescr = [[NSSortDescriptor alloc] initWithKey:@"strField" ascending:YES];
// Combine the two
NSArray *sortDescriptors = @[boolDescr, strDescr];
// Sort your array
NSArray *sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors];

您可以阅读有关使用描述符here进行排序的更多信息。

答案 1 :(得分:4)

使用排序描述符的替代方法是使用NSComparator

NSArray *myObjects = ... // your array of "Foo" objects
NSArray *sortedArray = [myObjects sortedArrayUsingComparator:^(Foo *obj1, Foo *obj2) {
    if ((obj1.boolProp && obj2.boolProp) || (!obj1.boolProp && !obj2.boolProp)) {
        // Both bools are either YES or both are NO so sort by the string property
        return [obj1.stringProp compare:obj2.stringProp];
    } else if (obj1.boolProp) {
        // first is YES, second is NO
        return NSOrderedAscending;
    } else {
        // second is YES, first is NO
        return NSOrderedDescending;
    }
)];

请注意我可能会向后退两个。如果在Yes值之前对No值进行排序,则交换最后两个返回值。

答案 2 :(得分:2)

查找NSSortDescriptors。创建两个,一个用于字符串,一个用于bool。然后将两者都添加到数组中。然后使用NSArray方法sortedArrayWiyhDescriptors。