2013-06-24 41 views
7

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

回答

20

您可以使用NSSortDescriptor s完成排序:

// 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

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

3

使用排序描述符的替代方法是使用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值排序,则交换最后两个返回值。